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

