1 #Region "Microsoft.VisualBasic::e4b33b27033780c9a03d6dbaf095a42d, Microsoft.VisualBasic.Core\Extensions\Doc\PartitionedStream.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     Delegate Function
35     
36     
37     '     Class PartitionedStream
38     
39     '         Properties: Current, EOF, Total
40     
41     '         Constructor: (+2 OverloadsSub New
42     
43     '         Function: PartitionByLines, ReadPartition, ToString
44     
45     '         Sub: (+2 Overloads) Dispose
46     
47     
48     
49     ' /********************************************************************************/
50
51 #End Region
52
53 Imports System.Text
54
55 Public Delegate Function PartitioningMethod(block As StringByRef Left As StringAs String()
56
57 Namespace Text
58
59     ''' <summary>
60     ''' 只是针对文本文件的
61     ''' </summary>
62     Public Class PartitionedStream : Implements System.IDisposable
63
64         ReadOnly _readerStream As IO.FileStream
65         ReadOnly _blockSize As Integer
66         ReadOnly _partitions As PartitioningMethod
67         ReadOnly _encoding As System.Text.Encoding
68
69         Sub New(path As String, blockSize As Integer, partitioning As PartitioningMethod, Optional encoding As Encoding = Nothing)
70             _readerStream = New IO.FileStream(path, IO.FileMode.Open)
71             _blockSize = blockSize
72             _partitions = partitioning
73             _Total = _readerStream.Length
74
75             If _encoding Is Nothing Then
76                 _encoding = System.Text.Encoding.Default
77             Else
78                 _encoding = encoding
79             End If
80         End Sub
81
82         ''' <summary>
83         ''' 依照换行符来进行分区
84         ''' </summary>
85         ''' <param name="path"></param>
86         ''' <param name="blockSize"></param>
87         ''' <param name="encoding"></param>
88         Sub New(path As String, blockSize As IntegerOptional encoding As Encoding = Nothing)
89             Call Me.New(path, blockSize, AddressOf PartitionedStream.PartitionByLines, encoding)
90         End Sub
91
92         Public ReadOnly Property EOF As Boolean
93             Get
94                 Return _Current >= _Total
95             End Get
96         End Property
97
98         Public ReadOnly Property Current As Long
99         Public ReadOnly Property Total As Long
100
101         Dim previous As Byte()
102
103         Public Function ReadPartition() As String()
104             If EOF Then Return Nothing
105
106             Dim chunkBuffer As Byte()
107
108             If _Current + _blockSize > _Total Then
109                 chunkBuffer = New Byte(_blockSize - 1) {}
110             Else
111                 chunkBuffer = New Byte(_Total - _Current - 1) {}
112             End If
113
114             Call _readerStream.Read(chunkBuffer, _Current, chunkBuffer.Length)
115             Call previous.Add(chunkBuffer)
116
117             Dim Text As String = _encoding.GetString(previous)
118             Dim rtvl = Me._partitions(Text, Text)
119             previous = _encoding.GetBytes(Text)
120             Return rtvl
121         End Function
122
123         Public Overrides Function ToString() As String
124             Return _readerStream.Name
125         End Function
126
127 #Region "IDisposable Support"
128         Private disposedValue As Boolean To detect redundant calls
129
130         ' IDisposable
131         Protected Overridable Sub Dispose(disposing As Boolean)
132             If Not Me.disposedValue Then
133                 If disposing Then
134                     ' TODO: dispose managed state (managed objects).
135                 End If
136
137                 ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
138                 ' TODO: set large fields to null.
139             End If
140             Me.disposedValue = True
141         End Sub
142
143         ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
144         'Protected Overrides Sub Finalize()
145         '    ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
146         '    Dispose(False)
147         '    MyBase.Finalize()
148         'End Sub
149
150         ' This code added by Visual Basic to correctly implement the disposable pattern.
151         Public Sub Dispose() Implements IDisposable.Dispose
152             Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
153             Dispose(True)
154             ' TODO: uncomment the following line if Finalize() is overridden above.
155             ' GC.SuppressFinalize(Me)
156         End Sub
157 #End Region
158
159         Public Shared Function PartitionByLines(block As StringByRef Left As StringAs String()
160             Dim Tokens As String() = block.LineTokens
161
162             Left = Tokens.LastOrDefault
163             Tokens = Tokens.Takes(Tokens.Length - 1).ToArray
164             Return Tokens
165         End Function
166     End Class
167 End Namespace