C#文件讀寫操作詳細操作指南
前言
文件是存儲在磁盤中的具有特定名稱和目錄路徑的數(shù)據(jù)集合,當(dāng)我們使用程序?qū)ξ募M行讀取或?qū)懭霑r,程序會將文件以數(shù)據(jù)流(簡稱流)的形式讀入內(nèi)存中。我們可以將流看作是通過通信路徑傳遞的字節(jié)序列,流主要分為輸入流和輸出流,輸入流主要用于從文件讀取數(shù)據(jù)(讀操作),輸出流主要用于向文件中寫入數(shù)據(jù)(寫操作)。
C# 中的 I/O 類
System.IO 命名空間中包含了各種用于文件操作的類,例如文件的創(chuàng)建、刪除、讀取、寫入等等。如下表中所示:
I/O 類 | 描述 |
---|---|
BinaryReader | 從二進制流中讀取原始數(shù)據(jù) |
BinaryWriter | 以二進制格式寫入原始數(shù)據(jù) |
BufferedStream | 臨時存儲字節(jié)流 |
Directory | 對目錄進行復(fù)制、移動、重命名、創(chuàng)建和刪除等操作 |
DirectoryInfo | 用于對目錄執(zhí)行操作 |
DriveInfo | 獲取驅(qū)動器的信息 |
File | 對文件進行操作 |
FileInfo | 用于對文件執(zhí)行操作 |
FileStream | 用于文件中任何位置的讀寫 |
MemoryStream | 用于隨機訪問存儲在內(nèi)存中的數(shù)據(jù)流 |
Path | 對路徑信息執(zhí)行操作 |
StreamReader | 用于從字節(jié)流中讀取字符 |
StreamWriter | 用于向一個流中寫入字符 |
StringReader | 用于從字符串緩沖區(qū)讀取數(shù)據(jù) |
StringWriter | 用于向字符串緩沖區(qū)寫入數(shù)據(jù) |
FileStream 類
FileStream 類在 System.IO 命名空間下,使用它可以讀取、寫入和關(guān)閉文件。創(chuàng)建 FileStream 類對象的語法格式如下所示:
FileStream <object_name> = new FileStream(<file_name>, <FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);
參數(shù)說明如下:
- object_name:創(chuàng)建的對象名稱;
- file_name:文件的路徑(包含文件名在內(nèi));
- FileMode:枚舉類型,用來設(shè)定文件的打開方式,可選值如下:
- Append:打開一個已有的文件,并將光標(biāo)放置在文件的末尾。如果文件不存在,則創(chuàng)建文件;
- Create:創(chuàng)建一個新的文件,如果文件已存在,則將舊文件刪除,然后創(chuàng)建新文件;
- CreateNew:創(chuàng)建一個新的文件,如果文件已存在,則拋出異常;
- Open:打開一個已有的文件,如果文件不存在,則拋出異常;
- OpenOrCreate:打開一個已有的文件,如果文件不存在,則創(chuàng)建一個新的文件并打開;
- Truncate:打開一個已有的文件,然后將文件清空(刪除原有內(nèi)容),如果文件不存在,則拋出異常。
- FileAccess:枚舉類型,用來設(shè)置文件的存取,可選值有 Read、ReadWrite 和 Write;
- FileShare:枚舉類型,用來設(shè)置文件的權(quán)限,可選值如下:
- Inheritable:允許子進程繼承文件句柄,Win32 不直接支持此功能;
- None:在文件關(guān)閉前拒絕共享當(dāng)前文件,打開該文件的任何請求(由此進程或另一進程發(fā)出的請求)都將失敗;
- Read:允許隨后打開文件讀取,如果未指定此標(biāo)志,則文件關(guān)閉前,任何打開該文件以進行讀取的請求都將失敗,需要注意的是,即使指定了此標(biāo)志,仍需要附加權(quán)限才能夠訪問該文件;
- ReadWrite:允許隨后打開文件讀取或?qū)懭?,如果未指定此?biāo)志,則文件關(guān)閉前,任何打開該文件以進行讀取或?qū)懭氲恼埱蠖紝⑹?,需要注意的是,即使指定了此?biāo)志,仍需要附加權(quán)限才能夠訪問該文件;
- Write:允許隨后打開文件寫入,如果未指定此標(biāo)志,則文件關(guān)閉前,任何打開該文件以進行寫入的請求都將失敗,需要注意的是,即使指定了此標(biāo)志,仍可能需要附加權(quán)限才能夠訪問該文件;
- Delete:允許隨后刪除文件。
例如,我們創(chuàng)建一個 FileStream 對象 F 來讀取一個名為 sample.txt 的文件,示例代碼如下所示:
FileStream F = new FileStream(“sample.txt”, FileMode.Open, FileAccess.Read, FileShare.Read);
FileStream 類中的常用方法如下所示:
方法 | 描述 |
---|---|
Close() | 關(guān)閉當(dāng)前流并釋放與之關(guān)聯(lián)的所有資源(如套接字和文件句柄) |
CopyTo(Stream) | 從當(dāng)前流中讀取字節(jié)并將其寫入到另一流中 |
Dispose() | 釋放由 Stream 使用的所有資源 |
Equals(Object) | 判斷指定對象是否等于當(dāng)前對象 |
Finalize() | 確保垃圾回收器回收 FileStream 時釋放資源并執(zhí)行其他清理操作 |
Flush() | 清除此流的緩沖區(qū),使得所有緩沖數(shù)據(jù)都寫入到文件中 |
GetHashCode() | 默認(rèn)哈希函數(shù) |
GetType() | 獲取當(dāng)前實例的 Type |
Lock(Int64, Int64) | 防止其他進程讀取或?qū)懭?FileStream |
Read(Byte[], Int32, Int32) | 從流中讀取字節(jié)塊并將該數(shù)據(jù)寫入給定緩沖區(qū)中 |
ReadByte() | 從文件中讀取一個字節(jié),并將讀取位置提升一個字節(jié) |
ToString() | 返回表示當(dāng)前對象的字符串 |
Unlock(Int64, Int64) | 允許其他進程訪問以前鎖定的某個文件的全部或部分 |
Write(Byte[], Int32, Int32) | 將字節(jié)塊寫入文件流 |
WriteByte(Byte) | 將一個字節(jié)寫入文件流中的當(dāng)前位置 |
【示例】使用 FileStream 類讀取指定的文件:
using System; using System.IO; namespace c.biancheng.net { class Demo { static void Main(string[] args) { FileStream file = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); for(int i = 0; i < 20; i++){ file.WriteByte((byte)i); } file.Position = 0; for(int i = 0; i < 20; i++){ Console.Write(file.ReadByte() + " "); } file.Close(); Console.ReadKey(); } } }
運行結(jié)果:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
C#中文本文件的讀取寫入
System.IO 命名空間下的 StreamReader 和 StreamWriter 類可以用于文本文件的數(shù)據(jù)讀寫。這些類繼承自抽象基類 Stream,Stream 類提供了對文件流讀寫的功能。
1) StreamReader
StreamReader 類繼承自抽象基類 TextReader,用來從文件中讀取一系列字符,下表列出了 StreamReader 類中一些常用的方法:
方法 | 描述 |
---|---|
public override void Close() | 關(guān)閉 StreamReader 對象和基礎(chǔ)流,并釋放任何與之相關(guān)的系統(tǒng)資源 |
public override int Peek() | 返回下一個可用的字符,但不使用它 |
public override int Read() | 從輸入流中讀取下一個字符,并把字符位置往前移一個字符 |
如果想查閱完整的方法列表,可以訪問官方API
【示例】使用 StreamReader 讀取指定文件的內(nèi)容,文件的內(nèi)容如下所示:
薪薪代碼
你好
C# 教程
示例代碼如下:
using System; using System.IO; namespace c.biancheng.net { class Demo { static void Main(string[] args) { try{ // 創(chuàng)建 StreamReader 類的對象 StreamReader file = new StreamReader("test.txt"); string line; // 從文件中讀取內(nèi)容 while((line = file.ReadLine()) != null){ Console.WriteLine(line); } }catch(Exception e){ // 展示出錯信息 Console.WriteLine("無法讀取文件"); Console.WriteLine(e.Message); } Console.ReadKey(); } } }
運行上述代碼即可輸出文件中的內(nèi)容。
2) StreamWriter
StreamWriter 類同樣繼承自抽象類 TextWriter,用來向文件中寫入一系列字符,下表列出了 StreamWriter 類中一些常用的方法:
方法 | 描述 |
---|---|
public override void Close() | 關(guān)閉當(dāng)前的 StreamWriter 對象和基礎(chǔ)流 |
public override void Flush() | 清理當(dāng)前所有的緩沖區(qū),使所有緩沖數(shù)據(jù)寫入基礎(chǔ)流 |
public virtual void Write(bool value) | 將布爾值的文本表示形式寫入文本流 |
public override void Write(char value) | 將一個字符寫入流 |
public virtual void Write(decimal value) | 將一個小數(shù)值的文本表示形式寫入文本流 |
public virtual void Write(double value) | 將一個 8 字節(jié)浮點值的文本表示形式寫入文本流 |
public virtual void Write(int value) | 將一個 4 字節(jié)有符號整數(shù)的文本表示形式寫入文本流 |
public override void Write(string value) | 將一個字符串寫入文本流 |
public virtual void WriteLine() | 將行結(jié)束符寫入文本流 |
完整的方法列表請查閱官方API
【示例】向文件中寫入指定內(nèi)容。
using System; using System.IO; namespace c.biancheng.net { class Demo { static void Main(string[] args) { // 要寫入文件中的數(shù)據(jù) string[] str = new string[]{ "薪薪代碼", "你好", "C# 教程" }; // 創(chuàng)建 StreamWriter 類的對象 StreamWriter file = new StreamWriter("demo.txt"); // 將數(shù)組中的數(shù)據(jù)寫入文件 foreach(string s in str){ file.WriteLine(s); } file.Close(); // 讀取文件中的內(nèi)容 string line = ""; StreamReader readfile = new StreamReader("demo.txt"); while((line = readfile.ReadLine()) != null){ Console.WriteLine(line); } readfile.Close(); Console.ReadKey(); } } }
運行結(jié)果如下:
薪薪代碼
你好
C# 教程
二進制文件讀寫
C# 中的 BinaryReader 和 BinaryWriter 類可以用于二進制文件的讀寫。
1) BinaryReader 類
BinaryReader 類用于從文件讀取二進制數(shù)據(jù),類中的常用方法如下所示:
方法 | 描述 |
---|---|
public override void Close() | 關(guān)閉 BinaryReader 對象和基礎(chǔ)流 |
public virtual int Read() | 從基礎(chǔ)流中讀取字符,并根據(jù)所使用的編碼和從流中讀取的特定字符,將流的當(dāng)前位置前移 |
public virtual bool ReadBoolean() | 從當(dāng)前流中讀取一個布爾值,并將流的當(dāng)前位置前移一個字節(jié) |
public virtual byte ReadByte() | 從當(dāng)前流中讀取下一個字節(jié),并將流的當(dāng)前位置前移一個字節(jié) |
public virtual byte[] ReadBytes(int count) | 從當(dāng)前流中讀取指定數(shù)目的字節(jié)到一個字節(jié)數(shù)組中,并將流的當(dāng)前位置前移指定數(shù)目的字節(jié) |
public virtual char ReadChar() | 從當(dāng)前流中讀取下一個字節(jié),并把流的當(dāng)前位置按照所使用的編碼和從流中讀取的指定的字符往前移 |
public virtual char[] ReadChars(int count) | 從當(dāng)前流中讀取指定數(shù)目的字符,并以字符數(shù)組的形式返回數(shù)據(jù),并把流的當(dāng)前位置按照所使用的編碼和從流中讀取的指定的字符往前移 |
public virtual double ReadDouble() | 從當(dāng)前流中讀取一個 8 字節(jié)浮點值,并把流的當(dāng)前位置前移八個字節(jié) |
public virtual int ReadInt32() | 從當(dāng)前流中讀取一個 4 字節(jié)有符號整數(shù),并把流的當(dāng)前位置前移四個字節(jié) |
public virtual string ReadString() | 從當(dāng)前流中讀取一個字符串,字符串以長度作為前綴,同時編碼為一個七位的整數(shù) |
完整的方法列表請查閱 官方API
2) BinaryWriter 類
BinaryWriter 類用于向文件寫入二進制數(shù)據(jù),類中的常用方法如下表所示:
方法 | 描述 |
---|---|
public override void Close() | 關(guān)閉 BinaryWriter 對象和基礎(chǔ)流 |
public virtual void Flush() | 清理當(dāng)前編寫器的所有緩沖區(qū),使得所有緩沖數(shù)據(jù)寫入基礎(chǔ)設(shè)備 |
public virtual long Seek(int offset,SeekOrigin origin) | 設(shè)置當(dāng)前流中的位置 |
public virtual void Write(bool value) | 將一個字節(jié)的布爾值寫入到當(dāng)前流中,0 表示 false,1 表示 true |
public virtual void Write(byte value) | 將一個無符號字節(jié)寫入到當(dāng)前流中,并把流的位置前移一個字節(jié) |
public virtual void Write(byte[] buffer) | 將一個字節(jié)數(shù)組寫入到基礎(chǔ)流中 |
public virtual void Write(char ch) | 將一個 Unicode 字符寫入到當(dāng)前流中,并把流的當(dāng)前位置按照所使用的編碼和要寫入到流中的指定字符往前移 |
public virtual void Write(char[] chars) | 將一個字符數(shù)組寫入到當(dāng)前流中,并把流的當(dāng)前位置按照所使用的編碼和要寫入到流中的指定字符往前移 |
public virtual void Write(double value) | 將一個 8 字節(jié)浮點值寫入到當(dāng)前流中,并把流位置前移八個字節(jié) |
public virtual void Write(int value) | 將一個 4 字節(jié)有符號整數(shù)寫入到當(dāng)前流中,并把流位置前移四個字節(jié) |
public virtual void Write(string value) | 將一個有長度前綴的字符串按 BinaryWriter 的當(dāng)前編碼寫如到流中,并把流的當(dāng)前位置按照所使用的編碼和要寫入到流中的指定字符往前移 |
完整的方法列表請查閱官方API
【示例】下面通過示例演示二進制文件的讀取和寫入:
using System; using System.IO; namespace c.biancheng.net { class Demo { static void Main(string[] args) { BinaryWriter bw; BinaryReader br; int i = 520; double d = 3.14159; bool b = true; string s = "薪薪代碼"; // 創(chuàng)建文件 try{ bw = new BinaryWriter(new FileStream("mydata", FileMode.Create)); }catch (IOException e){ Console.WriteLine(e.Message + "\n 文件創(chuàng)建失敗!"); return; } // 寫入文件 try{ bw.Write(i); bw.Write(d); bw.Write(b); bw.Write(s); }catch (IOException e){ Console.WriteLine(e.Message + "\n 文件寫入失敗!"); } bw.Close(); // 讀取文件 try{ br = new BinaryReader(new FileStream("mydata", FileMode.Open)); }catch (IOException e){ Console.WriteLine(e.Message + "\n 文件打開失??!"); return; } try{ i = br.ReadInt32(); Console.WriteLine("Integer data: {0}", i); d = br.ReadDouble(); Console.WriteLine("Double data: {0}", d); b = br.ReadBoolean(); Console.WriteLine("Boolean data: {0}", b); s = br.ReadString(); Console.WriteLine("String data: {0}", s); }catch (IOException e){ Console.WriteLine(e.Message + "\n 文件讀取失??!."); } br.Close(); Console.ReadKey(); } } }
運行結(jié)果:
Integer data: 520
Double data: 3.14159
Boolean data: True
String data:薪薪代碼
總結(jié)
到此這篇關(guān)于C#文件讀寫操作的文章就介紹到這了,更多相關(guān)C#文件讀寫操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn)
這篇文章主要為大家詳細介紹了unity3D實現(xiàn)物體任意角度自旋轉(zhuǎn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07C#中的小數(shù)和百分?jǐn)?shù)計算與byte數(shù)組操作
這篇文章介紹了C#中的小數(shù)和百分?jǐn)?shù)計算與byte數(shù)組操作,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04