Csharp/CSharp Tutorial/File Directory Stream/FileStream
Содержание
- 1 Binary File Reading through FileStream
- 2 Demonstrate random access file
- 3 Is a stream seekable
- 4 Move file pointer to beginning of file
- 5 Open a file with exception handling
- 6 Open an existing file
- 7 Read every other value using FileSeek
- 8 Read file stream as an array of bytes
- 9 Read file stream on a per byte basis
- 10 Reset internal position for a FileStream
- 11 Text File Reading with FileStream
- 12 The FileMode and FileAccess
- 13 Use FileStream to read a file byte by byte
- 14 Use FileStream to read a file selected from OpenFileDialog
- 15 Use FileStream to write/read a file byte by byte
- 16 using statement and FileStream
- 17 Write byte array with FileStream
- 18 Write data to file through FileStream per byte
- 19 Write data to file through FileStream via an array
- 20 Write/read bytes using FileStream
Binary File Reading through FileStream
<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; public class MainClass {
public static void Main() { int nCols = 16; FileStream inStream = new FileStream("c:\\a.txt", FileMode.Open, FileAccess.Read); long nBytesToRead = inStream.Length; if (nBytesToRead > 65536 / 4) nBytesToRead = 65536 / 4; int nLines = (int)(nBytesToRead / nCols) + 1; string[] lines = new string[nLines]; int nBytesRead = 0; for (int i = 0; i < nLines; i++) { StringBuilder nextLine = new StringBuilder(); nextLine.Capacity = 4 * nCols; for (int j = 0; j < nCols; j++) { int nextByte = inStream.ReadByte(); nBytesRead++; if (nextByte < 0 || nBytesRead > 65536) break; char nextChar = (char)nextByte; if (nextChar < 16) nextLine.Append(" x0" + string.Format("{0,1:X}", (int)nextChar)); else if (char.IsLetterOrDigit(nextChar) || char.IsPunctuation(nextChar)) nextLine.Append(" " + nextChar + " "); else nextLine.Append(" x" + string.Format("{0,2:X}", (int)nextChar)); } } inStream.Close();
}
}</source>
Demonstrate random access file
<source lang="csharp">using System; using System.IO;
class MainClass {
public static void Main() { FileStream f; char ch; try { f = new FileStream("random.dat", FileMode.Create); } catch(IOException exc) { Console.WriteLine(exc.Message); return ; } // Write the alphabet. for(int i=0; i < 26; i++) { try { f.WriteByte((byte)("A"+i)); } catch(IOException exc) { Console.WriteLine(exc.Message); return ; } } try { f.Seek(0, SeekOrigin.Begin); // seek to first byte ch = (char) f.ReadByte(); Console.WriteLine("First value is " + ch); f.Seek(1, SeekOrigin.Begin); // seek to second byte ch = (char) f.ReadByte(); Console.WriteLine("Second value is " + ch); f.Seek(4, SeekOrigin.Begin); // seek to 5th byte ch = (char) f.ReadByte(); Console.WriteLine("Fifth value is " + ch); Console.WriteLine(); } catch(IOException exc) { Console.WriteLine(exc.Message); } Console.WriteLine(); f.Close(); }
}</source>
First value is A Second value is B Fifth value is E
Is a stream seekable
<source lang="csharp">using System; using System.IO; public class MainClass {
public static void Main() { byte[] buf2 = new byte[] { 97, 112, 112, 108, 101, 115, 97, 117, 99, 101 }; FileStream s = new FileStream("Foo.txt", FileMode.Open); Console.WriteLine("Length: {0}, Position: {1}", s.Length, s.Position); if (s.CanSeek) { s.Seek(13, SeekOrigin.Begin); Console.WriteLine( "Position: {0}", s.Position); s.Write(buf2, 0, buf2.Length); } }
}</source>
Move file pointer to beginning of file
<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
class Program { static void Main(string[] args) { FileStream aFile = new FileStream("Temp.txt", FileMode.Create); char[] charData = "this is a test.".ToCharArray(); byte[] byData = new byte[charData.Length]; Encoder e = Encoding.UTF8.GetEncoder(); e.GetBytes(charData, 0, charData.Length, byData, 0, true); // Move file pointer to beginning of file. aFile.Seek(0, SeekOrigin.Begin); aFile.Write(byData, 0, byData.Length); } }</source>
Open a file with exception handling
<source lang="csharp">FileStream fin;
try {
fin = new FileStream("test.dat", FileMode.Open);
} catch(FileNotFoundException exc) {
Console.WriteLine(exc.Message); return;
} catch {
Console.WriteLine("Cannot open file."); return;
}</source>
Open an existing file
<source lang="csharp">using System; using System.IO; public class MainClass {
static void Main(string[] args) { FileInfo MyFile = new FileInfo(@"c:\Testing.txt"); FileStream MyStream; MyStream = MyFile.Open(FileMode.Open, FileAccess.Read, FileShare.None); }
}</source>
Read every other value using FileSeek
<source lang="csharp">using System; using System.IO;
class MainClass {
public static void Main() { FileStream f; char ch; try { f = new FileStream("random.dat", FileMode.Create); } catch(IOException exc) { Console.WriteLine(exc.Message); return ; } // Write the alphabet. for(int i=0; i < 26; i++) { try { f.WriteByte((byte)("A"+i)); } catch(IOException exc) { Console.WriteLine(exc.Message); return ; } } try { Console.WriteLine("Here is every other value: "); for(int i=0; i < 26; i += 2) { f.Seek(i, SeekOrigin.Begin); // seek to ith double ch = (char) f.ReadByte(); Console.Write(ch + " "); } } catch(IOException exc) { Console.WriteLine(exc.Message); } Console.WriteLine(); f.Close(); }
}</source>
Here is every other value: A C E G I K M O Q S U W Y
Read file stream as an array of bytes
<source lang="csharp">using System; using System.IO; public class MainClass {
static void Main(string[] args) { FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create); int NumberOfBytes = 200; byte[] MyByteArray = new Byte[NumberOfBytes]; int BytesRead = MyFileStream1.Read(MyByteArray, 0, NumberOfBytes); MyFileStream1.Close(); }
}</source>
Read file stream on a per byte basis
<source lang="csharp">using System; using System.IO; public class MainClass {
static void Main(string[] args) { FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create); int MyBytes = MyFileStream1.ReadByte(); MyFileStream1.Close(); }
}</source>
Reset internal position for a FileStream
<source lang="csharp">using System; using System.IO; public class MainClass {
public static int Main(string[] args) { FileInfo f = new FileInfo(@"C:\test.txt"); FileStream s = f.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); for(int i = 0; i < 256; i++) { s.WriteByte((byte)i); } // Reset internal position. s.Position = 0; for(int i = 0; i < 256; i++) { Console.Write(s.ReadByte()); } s.Close(); f.Delete(); return 0; }
}</source>
Text File Reading with FileStream
<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
class Program { static void Main(string[] args) { byte[] byData = new byte[200]; char[] charData = new Char[200]; FileStream aFile = new FileStream("Program.cs", FileMode.Open); aFile.Seek(113, SeekOrigin.Begin); aFile.Read(byData, 0, 200); Decoder d = Encoding.UTF8.GetDecoder(); d.GetChars(byData, 0, byData.Length, charData, 0); Console.WriteLine(charData); } }</source>
The FileMode and FileAccess
Value Description FileMode.Append append to the end of file. FileMode.Create create a new output file. Any preexisting file by the same name will be destroyed. FileMode.CreateNew create a new output file. The file must not already exist. FileMode.Open open a preexisting file. FileMode.OpenOrCreate open a file if it exists, or create the file if it does not already exist. FileMode.Truncate open a preexisting file, but reduce its length to zero.
If you want to restrict access to just reading or just writing, use this constructor:
<source lang="csharp">FileStream(string filename, FileMode mode, FileAccess how)</source>
Use FileStream to read a file byte by byte
<source lang="csharp">using System; using System.Windows.Forms; using System.IO; class MainClass {
public static void Main() { OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Title="Select file to back up"; if (dlgOpen.ShowDialog() == DialogResult.OK) { FileStream inStream = File.OpenRead(dlgOpen.FileName); FileStream outStream = File.OpenWrite(dlgOpen.FileName + ".bak"); int b; while ((b = inStream.ReadByte()) > -1) outStream.WriteByte( (byte) b); outStream.Flush(); outStream.Close(); inStream.Close(); } }
}</source>
Use FileStream to read a file selected from OpenFileDialog
<source lang="csharp">using System; using System.Windows.Forms; using System.IO; class MainClass {
public static void Main() { OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Title="Select file to back up"; if (dlgOpen.ShowDialog() == DialogResult.OK) { FileStream inStream = File.OpenRead(dlgOpen.FileName); FileStream outStream = File.OpenWrite(dlgOpen.FileName + ".bak"); int b; while ((b = inStream.ReadByte()) > -1) outStream.WriteByte( (byte) b); outStream.Flush(); outStream.Close(); inStream.Close(); } }
}</source>
Use FileStream to write/read a file byte by byte
<source lang="csharp">using System; using System.Windows.Forms; using System.IO; class MainClass {
public static void Main() { OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Title="Select file to back up"; if (dlgOpen.ShowDialog() == DialogResult.OK) { FileStream inStream = File.OpenRead(dlgOpen.FileName); FileStream outStream = File.OpenWrite(dlgOpen.FileName + ".bak"); int b; while ((b = inStream.ReadByte()) > -1) outStream.WriteByte( (byte) b); outStream.Flush(); outStream.Close(); inStream.Close(); } }
}</source>
using statement and FileStream
<source lang="csharp">using System; using System.Collections.Generic; using System.Text; using System.IO;
class Program { static void Main(string[] args) { using (FileStream fStream = File.Open(@"C:\myMessage.dat",FileMode.Create)) { string msg = "Hello!"; byte[] msgAsByteArray = Encoding.Default.GetBytes(msg); fStream.Write(msgAsByteArray, 0, msgAsByteArray.Length); fStream.Position = 0; byte[] bytesFromFile = new byte[msgAsByteArray.Length]; for (int i = 0; i < msgAsByteArray.Length; i++) { bytesFromFile[i] = (byte)fStream.ReadByte(); Console.Write(bytesFromFile[i]); } Console.WriteLine(Encoding.Default.GetString(bytesFromFile)); } } }</source>
Write byte array with FileStream
<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
class Program { static void Main(string[] args) { FileStream aFile = new FileStream("Temp.txt", FileMode.Create); char[] charData = "this is a test.".ToCharArray(); byte[] byData = new byte[charData.Length]; Encoder e = Encoding.UTF8.GetEncoder(); e.GetBytes(charData, 0, charData.Length, byData, 0, true); // Move file pointer to beginning of file. aFile.Seek(0, SeekOrigin.Begin); aFile.Write(byData, 0, byData.Length); } }</source>
Write data to file through FileStream per byte
<source lang="csharp">using System; using System.IO; public class MainClass {
static void Main(string[] args) { FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create); byte MyWriteByte = 100; MyFileStream1.WriteByte(MyWriteByte); MyFileStream1.Close(); }
}</source>
Write data to file through FileStream via an array
<source lang="csharp">using System; using System.IO; public class MainClass {
static void Main(string[] args) { FileStream MyFileStream1 = new FileStream(@"c:\Testing.txt", FileMode.Create); int NumberOfBytesToWrite = 256; byte[] MyWriteByteArray = new Byte[NumberOfBytesToWrite]; for (int i = 0; i < 256; i++) { MyWriteByteArray[i] = (byte)i; i++; } MyFileStream1.Write(MyWriteByteArray, 0, NumberOfBytesToWrite); MyFileStream1.Close(); }
}</source>
Write/read bytes using FileStream
<source lang="csharp">using System; using System.IO; public class MainClass {
public static int Main(string[] args) { FileStream myFStream = new FileStream("test.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite); for(int i = 0; i < 256; i++) myFStream.WriteByte((byte)i); myFStream.Position = 0; for(int i = 0; i < 256; i++) Console.Write(myFStream.ReadByte()); Console.WriteLine(); myFStream.Close(); return 0; }
}</source>
0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 5556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021 0310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513 6137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 1701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022 0320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523 6237238239240241242243244245246247248249250251252253254255