2 // System.IO/FileStream.cs
5 // Dietmar Maurer (dietmar@ximian.com)
7 // (C) 2001 Ximian, Inc. http://www.ximian.com
11 using System.Runtime.InteropServices;
12 using System.Threading;
14 // fixme: I do not know how to handle errno when calling PInvoke functions
15 // fixme: emit the correct exceptions everywhere
20 public class FileStream : Stream
22 private OpSys _os = Platform.OS;
23 private IntPtr fdhandle;
24 private FileAccess acc;
27 public FileStream (IntPtr handle, FileAccess access)
28 : this (handle, access, true, 0, false) {}
30 public FileStream (IntPtr handle, FileAccess access, bool ownsHandle)
31 : this (handle, access, ownsHandle, 0, false) {}
33 public FileStream (IntPtr handle, FileAccess access, bool ownsHandle, int bufferSize)
34 : this (handle, access, ownsHandle, bufferSize, false) {}
36 public FileStream (IntPtr handle, FileAccess access, bool ownsHandle,
37 int bufferSize, bool isAsync)
45 public FileStream (string name, FileMode mode)
46 : this (name, mode, FileAccess.ReadWrite, FileShare.ReadWrite, 0, false) {}
48 public FileStream (string name, FileMode mode, FileAccess access)
49 : this (name, mode, access, FileShare.ReadWrite, 0, false) {}
51 public FileStream (string name, FileMode mode, FileAccess access, FileShare share)
52 : this (name, mode, access, share, 0, false) {}
54 public FileStream (string name, FileMode mode, FileAccess access,
55 FileShare share, int buferSize)
56 : this (name, mode, access, share, 0, false) {}
58 // fixme: implement all share, buffer, async
59 public FileStream (string name, FileMode mode, FileAccess access, FileShare share,
60 int buferSize, bool useAsync)
63 throw new ArgumentNullException ();
64 if (name == "" || name.IndexOfAny (Path.InvalidPathChars) != -1)
65 throw new ArgumentException ();
67 fdhandle = _os.OpenFile (name, mode, access, share);
69 /* Implement error checking, with some sort of access
70 to the errno error reason
71 if(fdhandle == error) {
72 throw new IOException();
80 public override bool CanRead
85 case FileAccess.ReadWrite:
87 case FileAccess.Write:
94 public override bool CanSeek
97 // fixme: not alway true
102 public override bool CanWrite
106 case FileAccess.Write:
107 case FileAccess.ReadWrite:
115 unsafe public override long Length
118 return _os.FileLength (fdhandle);
122 public override long Position
125 return _os.SeekFile (fdhandle, 0, SeekOrigin.Current);
128 _os.SeekFile (fdhandle, value, SeekOrigin.Begin);
132 public override void Flush ()
136 public override void Close ()
139 _os.CloseFile (fdhandle);
143 public unsafe override int Read (byte[] buffer,
147 return _os.ReadFile (fdhandle, buffer, offset, count);
150 public unsafe override int ReadByte ()
152 byte[] val = new byte[1];
153 int res = Read (val, 0, 1);
156 throw new IOException();
163 public override long Seek (long offset,
166 return _os.SeekFile (fdhandle, offset, origin);
169 public override void SetLength (long value)
171 _os.SetLengthFile (fdhandle, value);
174 public unsafe override void Write (byte[] buffer,
178 int res = _os.WriteFile (fdhandle, buffer, offset, count);
181 throw new IOException();
184 public unsafe override void WriteByte (byte value)
186 byte[] buf = new byte[1];
193 public virtual IntPtr Handle