source: Include/Classes/System/IO/FileStream.ab@ 271

Last change on this file since 271 was 271, checked in by dai, 17 years ago

SHFILEOPSTRUCT.hWnd → SHFILEOPSTRUCT.hwnd
System.IOに属するクラスに名前空間を適用した。

File size: 9.6 KB
RevLine 
[271]1Namespace System
2Namespace IO
[256]3
[271]4
[260]5/* ほんとはmiscに入れるかかファイルを分けたほうがいいかもしれないが一先ず実装 */
[256]6Enum FileOptions
7 Asynchronous
8 DeleteOnClose
9 Encrypted
10 None
11 RandomAccess
12 SequentialScan
13 WriteThrough
14End Enum
15
[105]16Class FileStream
[256]17 Inherits Stream
18
19 handle As HANDLE
20
21 /*
[260]22 ファイルハンドルからこれらを取得できれば、これらは入らないが
[256]23 今のところは不明なので自前で実装するしかない
24 */
25 filePath As String
26 fileMode As DWord
27 fileAccess As DWord
28 fileShare As DWord
29 fileOptions As DWord
30
31 /* 現在は未使用 */
32 /*Overlapped As OVERLAPPED*/
33
34Public
[260]35 /* コンストラクタ.NETと同じように実装は難しい、一先ず動くものを実装したが変更が必要だと思う */
[256]36 Sub FileStream(path As String, mode As FileMode, access As FileAccess, share As FileShare, options As FileOptions)
[260]37 Dim ac As DWord
38 Dim mo As DWord
39 Dim sh As DWord
40 Dim op As DWord
[256]41
42 Select Case access
43 Case FileAccess.Read
[260]44 ac=GENERIC_READ
[256]45 Case FileAccess.ReadWrite
[260]46 ac=GENERIC_READ or GENERIC_WRITE
[256]47 Case FileAccess.Write
[260]48 ac=GENERIC_WRITE
[256]49 End Select
50
51 Select Case share
52 Case FileShare.DeleteFile
[260]53 sh=FILE_SHARE_DELETE
[256]54 Case FileShare.None
[260]55 sh=0
[256]56 Case FileShare.Read
[260]57 sh=FILE_SHARE_READ
[256]58 Case FileShare.ReadWrite
[260]59 sh=FILE_SHARE_READ or FILE_SHARE_WRITE
60 Case FileShare.Write
61 sh=FILE_SHARE_WRITE
[256]62 End Select
63
64 Select Case mode
65 Case FileMode.Append
66 mo=OPEN_ALWAYS
67 Case FileMode.Create
68 mo=CREATE_ALWAYS
69 Case FileMode.CreateNew
70 mo=CREATE_NEW
71 Case FileMode.Open
72 mo=OPEN_EXISTING
73 Case FileMode.OpenOrCreate
74 mo=OPEN_ALWAYS
75 Case FileMode.Truncate
76 mo=TRUNCATE_EXISTING
77 End Select
78
79 Select Case options
[260]80 Case FileOptions.Asynchronous
81 op=FILE_FLAG_OVERLAPPED
[256]82 Case FileOptions.DeleteOnClose
[260]83 op=FILE_FLAG_DELETE_ON_CLOSE
[256]84 Case FileOptions.Encrypted
85 Case FileOptions.None
[260]86 op=0
[256]87 Case FileOptions.RandomAccess
[260]88 op=FILE_FLAG_RANDOM_ACCESS
[256]89 Case FileOptions.SequentialScan
[260]90 op=FILE_FLAG_SEQUENTIAL_SCAN
[256]91 Case FileOptions.WriteThrough
[260]92 op=FILE_FLAG_WRITE_THROUGH
[256]93 End Select
94
[260]95 This.handle=CreateFile(path.Chars As PSTR,ac,sh,ByVal NULL,mo,op,0)
96 If This.handle=INVALID_HANDLE_VALUE Then
[256]97 'エラー処理
98 'Throw ArgumentException
99 'Throw IOException
100 'Throw System.IO.FileNotFoundException
[260]101 This.handle=0
[256]102 Exit Sub
103 End If
104
[260]105 filePath = path
106 fileMode = mo
107 fileAccess = ac
108 fileShare = sh
109 fileOptions = op
[256]110 End Sub
[260]111 Sub FileStream(path As String, mode As FileMode, access As FileAccess, share As FileShare)
112 FileStream(path,mode,access,share,FileOptions.None)
113 End Sub
114 Sub FileStream(path As String, mode As FileMode, access As FileAccess)
115 FileStream(path,mode,access,FileShare.None,FileOptions.None)
116 End Sub
[256]117 Sub FileStream(path As String, mode As FileMode)
[260]118 Dim access As FileAccess
[256]119 Select Case mode
120 Case FileMode.Append
[260]121 access=FileAccess.Write
[256]122 Case FileMode.Create
[260]123 access=FileAccess.ReadWrite
[256]124 Case FileMode.CreateNew
[260]125 access=FileAccess.ReadWrite
[256]126 Case FileMode.Open
[260]127 access=FileAccess.ReadWrite
[256]128 Case FileMode.OpenOrCreate
[260]129 access=FileAccess.ReadWrite
[256]130 Case FileMode.Truncate
[260]131 access=FileAccess.Write
[256]132 End Select
[260]133 FileStream(path,mode,access,FileShare.None,FileOptions.None)
[256]134 End Sub
135
136 Sub ~FileStream()
137 This.Flush()
138 This.Close()
139 End Sub
140
141Public
142 Override Function CanRead() As Boolean
143 /* ファイルが読み込みに対応しているかを返す */
144 If fileAccess=GENERIC_READ/*FileAccess.Read*/ or fileAccess=GENERIC_READ or GENERIC_WRITE/*FileAccess.ReadWrite*/ Then
145 Return True
146 Else
147 Return False
148 End If
149 End Function
150
151 Override Function CanSeek() As Boolean
152 /* ファイルがシークに対応しているかを返す */
153 Return True
154 End Function
155
156 Override Function CanTimeout() As Boolean
157 /* ファイルがタイムアウトに対応しているかを返す */
158 Return False /*今のところ対応していないのでFalse*/
159 End Function
160
161 Override Function CanWrite() As Boolean
162 /* ファイルが書き込みに対応しているかを返す */
163 If fileAccess=GENERIC_WRITE/*FileAccess.Write*/ or fileAccess=GENERIC_READ or GENERIC_WRITE/*FileAccess.ReadWrite*/ Then
164 Return True
165 Else
166 Return False
167 End If
168 End Function
169
170 /*Handle*/
171
172 Function IsAsync() As Boolean
173 /* ファイルが非同期操作に対応しているかを返す */
174 If fileOptions=FILE_FLAG_OVERLAPPED/*FileOptions.Asynchronous*/ Then
175 Return True
176 Else
177 Return False
178 End If
179 End Function
180
181 Override Function Length() As Int64
182 /* ファイルのサイズの取得 */
183 Dim s As LARGE_INTEGER
184 s.LowPart=GetFileSize(This.handle,VarPtr(s.HighPart) As *DWord)
185 memcpy(VarPtr(Length),VarPtr(s),SizeOf(LARGE_INTEGER))
186 End Function
187
188 Function Name() As String
189 /* 多分文字列をコピーして返す方がいいのと思うが。。。*/
190 Return filePath
191 End Function
192
193 Override Sub Position(value As Int64)
194 /* ファイルポインタの位置の設定 */
195 Dim o As LARGE_INTEGER
196 memcpy(VarPtr(o),VarPtr(value),SizeOf(LARGE_INTEGER))
197 If o.HighPart=0 And value<0 Then
198 o.LowPart=-Abs(o.LowPart) As Long
199 End If
200 Dim ret As LARGE_INTEGER
201 SetFilePointer(This.handle,o.LowPart,VarPtr(o.HighPart) As *DWord,FILE_CURRENT)
202 End Sub
203 Override Function Position() As Int64
204 /* ファイルポインタの位置の取得 */
205 Dim o As LARGE_INTEGER
206 o.HighPart=0
207 o.LowPart=0
208 o.LowPart=SetFilePointer(This.handle,0,VarPtr(o.HighPart) As *DWord,FILE_CURRENT)
209 memcpy(VarPtr(Position),VarPtr(o),SizeOf(LARGE_INTEGER))
210 End Function
211
212 Override Sub ReadTimeout(value As Long)
213 'TODO
214 End Sub
215 Override Function ReadTimeout() As Long
216 'TODO
217 End Function
218
219 /* Safe~Handle系の実装は要相談!! */
220/* Function SafeFileHandle() As SafeFileHandle
221 End Function*/
222
223 Override Sub WriteTimeout(value As Long)
224 'TODO
225 End Sub
226 Override Function WriteTimeout() As Long
227 'TODO
228 End Function
229
230
231Public
[262]232 Override Function BeginRead(ByRef buffer[] As Byte, offset As Long, count As Long, callback As AsyncCallback, state As Object) As System.IAsyncResult
[256]233 'TODO
234 End Function
235
[262]236 Override Function BeginWrite(ByRef buffer[] As Byte, offset As Long, count As Long, callback As AsyncCallback, state As Object) As System.IAsyncResult
[256]237 'TODO
238 End Function
239
240 Override Sub Close()
241 CloseHandle(This.handle)
242 End Sub
243
244/* CreateObjRef*/
245/* Dispose*/
246
[262]247 Override Sub EndRead(ByRef asyncResult As System.IAsyncResult)
[256]248 'TODO
249 End Sub
250
[262]251 Override Sub EndWrite(ByRef asyncResult As System.IAsyncResult)
[256]252 'TODO
253 End Sub
254
255/* Equals*/
256
257 Override Sub Flush()
258 FlushFileBuffers(This.handle)
259 End Sub
260
261/* Function GetAccessControl() As FileSecurity
262 FileSecurityの実装がまだできてない。
263 End Function*/
264
265 Override Function GetHashCode() As Long
266 Return ObjPtr(This) As Long
267 End Function
268
269/* GetLifetimeService*/
270
271/* Override Function GetType() As TypeInfo
272 Return Super.GetType()
273 End Function*/
274
275/* InitializeLifetimeService*/
276
277 Sub Lock(position As Int64, length As Int64)
278 Dim p As LARGE_INTEGER
279 Dim l As LARGE_INTEGER
280 memcpy(VarPtr(p),VarPtr(position),SizeOf(LARGE_INTEGER))
281 memcpy(VarPtr(l),VarPtr(length),SizeOf(LARGE_INTEGER))
282 LockFile(This.handle,p.LowPart,p.HighPart,l.LowPart,l.HighPart)
283 End Sub
284
285 Override Function Read(ByRef buffer[] As Byte, offset As Long, count As Long) As Long
286 If offset Then
287 SetFilePointer(This.handle,offset,NULL,FILE_CURRENT)
288 End If
289 ReadFile(This.handle,buffer,count,VarPtr(Read) As *DWord,ByVal NULL)
290 End Function
291
292 Override Function ReadByte() As Long
293 Dim b As Byte
294 Dim ret = Read(b, 0, 1)
295 If ret <> 0 Then
296 Return b As Long
297 Else
298 Return -1
299 End If
300 End Function
301/* ReferenceEquals*/
302
303 Override Function Seek(offset As Int64, origin As SeekOrigin) As Long
304 Dim o As LARGE_INTEGER
305 memcpy(VarPtr(o),VarPtr(offset),SizeOf(LARGE_INTEGER))
306 If o.HighPart=0 And offset<0 Then
307 o.LowPart=-o.LowPart
308 End If
309 Select Case origin
310 Case SeekOrigin.Begin
311 SetFilePointer(This.handle,o.LowPart,VarPtr(o.HighPart) As *DWord,FILE_BEGIN)
312 Case SeekOrigin.Current
313 SetFilePointer(This.handle,o.LowPart,VarPtr(o.HighPart) As *DWord,FILE_CURRENT)
314 Case SeekOrigin.End
315 SetFilePointer(This.handle,o.LowPart,VarPtr(o.HighPart) As *DWord,FILE_END)
316 End Select
317 End Function
318
319/* Sub SetAccessControl(fileSecurity As FileSecurity)
320 FileSecurityの実装がまだできてない。
321 End Sub*/
322
323 Override Sub SetLength(value As Int64)
324 Dim o As LARGE_INTEGER
325 memcpy(VarPtr(o),VarPtr(value),SizeOf(LARGE_INTEGER))
326 If o.HighPart=0 And value<0 Then
327 o.LowPart=-o.LowPart
328 End If
329 If Length()=>value Then
330 SetFilePointer(This.handle,o.LowPart,VarPtr(o.HighPart) As *DWord,FILE_BEGIN)
331 SetEndOfFile(This.handle)
332 End If
333 End Sub
334
335/* Synchronized*/
336
337 Override Function ToString() As String
338 Return Name()
339 End Function
340
341 Sub Unlock(position As Int64, length As Int64)
342 Dim p As LARGE_INTEGER
343 Dim l As LARGE_INTEGER
344 memcpy(VarPtr(p),VarPtr(position),SizeOf(LARGE_INTEGER))
345 memcpy(VarPtr(l),VarPtr(length),SizeOf(LARGE_INTEGER))
346 UnlockFile(This.handle,p.LowPart,p.HighPart,l.LowPart,l.HighPart)
347 End Sub
348
349 Override Sub Write(ByRef buffer[] As Byte, offset As Long, count As Long)
350 If offset Then
351 SetFilePointer(This.handle,offset,NULL,FILE_CURRENT)
352 End If
353 Dim ret As DWord
354 WriteFile(This.handle,buffer,count,VarPtr(ret),ByVal NULL)
355 End Sub
356
357 Override Sub WriteByte(b As Byte)
358 Write(b, 0, 1)
359 End Sub
360
361Protected
362 /*非同期ファイル操作に必須だがどうやって実装しようか検討中*/
[262]363 Override Function CreateWaitHandle() As System.Threading.WaitHandle
[256]364' Return Nothing
365 End Function
366
367/* Dispose
368 Finalize
369 MemberwiseClone*/
[105]370End Class
[271]371
372
373End Namespace
374End Namespace
Note: See TracBrowser for help on using the repository browser.