浙江建設(shè)銀行官網(wǎng)站紀(jì)念幣seo和sem推廣
目錄
C#?文件的輸入與輸出
C# I/O 類(lèi)
FileStream 類(lèi)
文本文件的讀寫(xiě)
StreamReader 類(lèi)
StreamWriter 類(lèi)
實(shí)例
二進(jìn)制文件的讀寫(xiě)
BinaryReader 類(lèi)
BinaryWriter 類(lèi)
實(shí)例
Windows 文件系統(tǒng)的操作
DirectoryInfo 類(lèi)
FileInfo 類(lèi)
實(shí)例
C#?文件的輸入與輸出
一個(gè) 文件 是一個(gè)存儲(chǔ)在磁盤(pán)中帶有指定名稱和目錄路徑的數(shù)據(jù)集合。當(dāng)打開(kāi)文件進(jìn)行讀寫(xiě)時(shí),它變成一個(gè) 流。
從根本上說(shuō),流是通過(guò)通信路徑傳遞的字節(jié)序列。有兩個(gè)主要的流:輸入流 和 輸出流。輸入流用于從文件讀取數(shù)據(jù)(讀操作),輸出流用于向文件寫(xiě)入數(shù)據(jù)(寫(xiě)操作)。
C# I/O 類(lèi)
System.IO 命名空間有各種不同的類(lèi),用于執(zhí)行各種文件操作,如創(chuàng)建和刪除文件、讀取或?qū)懭胛募?#xff0c;關(guān)閉文件等。
下表列出了一些 System.IO 命名空間中常用的非抽象類(lèi):
I/O 類(lèi) | 描述 |
---|---|
BinaryReader | 從二進(jìn)制流讀取原始數(shù)據(jù)。 |
BinaryWriter | 以二進(jìn)制格式寫(xiě)入原始數(shù)據(jù)。 |
BufferedStream | 字節(jié)流的臨時(shí)存儲(chǔ)。 |
Directory | 有助于操作目錄結(jié)構(gòu)。 |
DirectoryInfo | 用于對(duì)目錄執(zhí)行操作。 |
DriveInfo | 提供驅(qū)動(dòng)器的信息。 |
File | 有助于處理文件。 |
FileInfo | 用于對(duì)文件執(zhí)行操作。 |
FileStream | 用于文件中任何位置的讀寫(xiě)。 |
MemoryStream | 用于隨機(jī)訪問(wèn)存儲(chǔ)在內(nèi)存中的數(shù)據(jù)流。 |
Path | 對(duì)路徑信息執(zhí)行操作。 |
StreamReader | 用于從字節(jié)流中讀取字符。 |
StreamWriter | 用于向一個(gè)流中寫(xiě)入字符。 |
StringReader | 用于讀取字符串緩沖區(qū)。 |
StringWriter | 用于寫(xiě)入字符串緩沖區(qū)。 |
FileStream 類(lèi)
FileStream 類(lèi)是位于 System.IO 命名空間中的一個(gè)重要類(lèi),它主要用于文件的讀寫(xiě)操作以及文件的關(guān)閉。作為 System.IO 命名空間中的一部分,FileStream 類(lèi)繼承自抽象類(lèi) Stream,這意味著它包含了許多用于處理字節(jié)流的方法和屬性。
您需要?jiǎng)?chuàng)建一個(gè)?FileStream?對(duì)象來(lái)創(chuàng)建一個(gè)新的文件,或打開(kāi)一個(gè)已有的文件。創(chuàng)建?FileStream?對(duì)象的語(yǔ)法如下:
FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);
例如,創(chuàng)建一個(gè) FileStream 對(duì)象?F?來(lái)讀取名為?sample.txt?的文件:
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
參數(shù) | 描述 |
---|---|
FileMode | FileMode?枚舉定義了各種打開(kāi)文件的方法。FileMode 枚舉的成員有:
|
FileAccess | FileAccess?枚舉的成員有:
|
FileShare | FileShare?枚舉的成員有:
|
下面是一個(gè)簡(jiǎn)單的示例,?
using System;
using System.IO;class Program
{static void Main(){// 文件路徑string filePath = "D:/example.txt";// 使用 Create 模式打開(kāi)文件,如果文件已存在則覆蓋,不存在則創(chuàng)建新文件using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)){// 準(zhǔn)備要寫(xiě)入文件的內(nèi)容string content = "你好,文件流!這是一個(gè)使用C#寫(xiě)入文件的示例。";// 將字符串轉(zhuǎn)換為字節(jié)數(shù)組byte[] data = System.Text.Encoding.UTF8.GetBytes(content);// 向文件中寫(xiě)入數(shù)據(jù)fileStream.Write(data, 0, data.Length);}// 使用 Open 模式打開(kāi)文件,以只讀方式訪問(wèn)using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)){// 準(zhǔn)備一個(gè)緩沖區(qū)來(lái)存儲(chǔ)從文件中讀取的數(shù)據(jù)byte[] buffer = new byte[1024];// 從文件中讀取數(shù)據(jù)int bytesRead = fileStream.Read(buffer, 0, buffer.Length);// 將讀取到的字節(jié)數(shù)組轉(zhuǎn)換為字符串string result = System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead);// 輸出從文件中讀取的內(nèi)容Console.WriteLine("文件內(nèi)容: " + result);}}
}
?在這個(gè)示例中,我們首先使用 FileStream 創(chuàng)建了一個(gè)新文件,并使用 FileMode.Create 和 FileAccess.Write 參數(shù)進(jìn)行了寫(xiě)入操作。然后使用相同的文件路徑和 FileMode.Open、FileAccess.Read 參數(shù)創(chuàng)建了另一個(gè) FileStream 對(duì)象,以只讀方式訪問(wèn)文件,并從中讀取數(shù)據(jù)。最后,將讀取到的數(shù)據(jù)轉(zhuǎn)換為字符串并輸出。
通過(guò)適當(dāng)設(shè)置 FileMode 和 FileAccess 參數(shù),可以根據(jù)需求對(duì)文件進(jìn)行不同的操作。同時(shí),務(wù)必在使用完畢后關(guān)閉文件流,以確保資源得到正確釋放。
文本文件的讀寫(xiě)
StreamReader?和?StreamWriter?類(lèi)用于文本文件的數(shù)據(jù)讀寫(xiě)。這些類(lèi)從抽象基類(lèi) Stream 繼承,Stream 支持文件流的字節(jié)讀寫(xiě)。
StreamReader 類(lèi)
StreamReader?類(lèi)繼承自抽象基類(lèi) TextReader,表示閱讀器讀取一系列字符。
下表列出了?StreamReader?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public override void Close() 關(guān)閉 StreamReader 對(duì)象和基礎(chǔ)流,并釋放任何與讀者相關(guān)的系統(tǒng)資源。 |
2 | public override int Peek() 返回下一個(gè)可用的字符,但不使用它。 |
3 | public override int Read() 從輸入流中讀取下一個(gè)字符,并把字符位置往前移一個(gè)字符。 |
如需查看完整的方法列表,請(qǐng)?jiān)L問(wèn)微軟的 C# 文檔。
StreamWriter 類(lèi)
StreamWriter?類(lèi)繼承自抽象類(lèi) TextWriter,表示編寫(xiě)器寫(xiě)入一系列字符。
下表列出了?StreamWriter?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public override void Close() 關(guān)閉當(dāng)前的 StreamWriter 對(duì)象和基礎(chǔ)流。 |
2 | public override void Flush() 清理當(dāng)前編寫(xiě)器的所有緩沖區(qū),使得所有緩沖數(shù)據(jù)寫(xiě)入基礎(chǔ)流。 |
3 | public virtual void Write(bool value) 把一個(gè)布爾值的文本表示形式寫(xiě)入到文本字符串或流。(繼承自 TextWriter。) |
4 | public override void Write( char value ) 把一個(gè)字符寫(xiě)入到流。 |
5 | public virtual void Write( decimal value ) 把一個(gè)十進(jìn)制值的文本表示形式寫(xiě)入到文本字符串或流。 |
6 | public virtual void Write( double value ) 把一個(gè) 8 字節(jié)浮點(diǎn)值的文本表示形式寫(xiě)入到文本字符串或流。 |
7 | public virtual void Write( int value ) 把一個(gè) 4 字節(jié)有符號(hào)整數(shù)的文本表示形式寫(xiě)入到文本字符串或流。 |
8 | public override void Write( string value ) 把一個(gè)字符串寫(xiě)入到流。 |
9 | public virtual void WriteLine() 把行結(jié)束符寫(xiě)入到文本字符串或流。 |
如需查看完整的方法列表,請(qǐng)?jiān)L問(wèn)微軟的 C# 文檔。
實(shí)例
using System;
using System.IO;class Program
{static void Main(){string filePath = "D:/dexample.txt";// 使用 StreamWriter 寫(xiě)入文件using (StreamWriter writer = new StreamWriter(filePath)){writer.WriteLine("你好!這是一個(gè)使用C#寫(xiě)入文件的示例。");writer.WriteLine("這是另一行文字。");}// 使用 StreamReader 讀取文件using (StreamReader reader = new StreamReader(filePath)){string line;while ((line = reader.ReadLine()) != null){Console.WriteLine(line);}}}
}
在這個(gè)示例中,我們首先使用 StreamWriter 打開(kāi)文件并寫(xiě)入了兩行文本。然后使用 StreamReader 打開(kāi)同一個(gè)文件,并逐行讀取其中的內(nèi)容,并將每行內(nèi)容輸出到控制臺(tái)。
使用 StreamWriter 和 StreamReader 可以實(shí)現(xiàn)更靈活和復(fù)雜的文件操作,比如逐行讀取、追加內(nèi)容、指定編碼等。同時(shí),using 關(guān)鍵字確保在使用完成后正確地關(guān)閉文件流,釋放資源。
二進(jìn)制文件的讀寫(xiě)
BinaryReader?和?BinaryWriter?類(lèi)用于二進(jìn)制文件的讀寫(xiě)。
BinaryReader 類(lèi)
BinaryReader?類(lèi)用于從文件讀取二進(jìn)制數(shù)據(jù)。一個(gè)?BinaryReader?對(duì)象通過(guò)向它的構(gòu)造函數(shù)傳遞?FileStream?對(duì)象而被創(chuàng)建。
下表列出了?BinaryReader?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public override void Close() 關(guān)閉 BinaryReader 對(duì)象和基礎(chǔ)流。 |
2 | public virtual int Read() 從基礎(chǔ)流中讀取字符,并把流的當(dāng)前位置往前移。 |
3 | public virtual bool ReadBoolean() 從當(dāng)前流中讀取一個(gè)布爾值,并把流的當(dāng)前位置往前移一個(gè)字節(jié)。 |
4 | public virtual byte ReadByte() 從當(dāng)前流中讀取下一個(gè)字節(jié),并把流的當(dāng)前位置往前移一個(gè)字節(jié)。 |
5 | public virtual byte[] ReadBytes( int count ) 從當(dāng)前流中讀取指定數(shù)目的字節(jié)到一個(gè)字節(jié)數(shù)組中,并把流的當(dāng)前位置往前移指定數(shù)目的字節(jié)。 |
6 | public virtual char ReadChar() 從當(dāng)前流中讀取下一個(gè)字節(jié),并把流的當(dāng)前位置按照所使用的編碼和從流中讀取的指定的字符往前移。 |
7 | public virtual char[] ReadChars( int count ) 從當(dāng)前流中讀取指定數(shù)目的字節(jié),在一個(gè)字符數(shù)組中返回?cái)?shù)組,并把流的當(dāng)前位置按照所使用的編碼和從流中讀取的指定的字符往前移。 |
8 | public virtual double ReadDouble() 從當(dāng)前流中讀取一個(gè) 8 字節(jié)浮點(diǎn)值,并把流的當(dāng)前位置往前移八個(gè)字節(jié)。 |
9 | public virtual int ReadInt32() 從當(dāng)前流中讀取一個(gè) 4 字節(jié)有符號(hào)整數(shù),并把流的當(dāng)前位置往前移四個(gè)字節(jié)。 |
10 | public virtual string ReadString() 從當(dāng)前流中讀取一個(gè)字符串。字符串以長(zhǎng)度作為前綴,同時(shí)編碼為一個(gè)七位的整數(shù)。 |
如需查看完整的方法列表,請(qǐng)?jiān)L問(wèn)微軟的 C# 文檔。
BinaryWriter 類(lèi)
BinaryWriter?類(lèi)用于向文件寫(xiě)入二進(jìn)制數(shù)據(jù)。一個(gè)?BinaryWriter?對(duì)象通過(guò)向它的構(gòu)造函數(shù)傳遞?FileStream?對(duì)象而被創(chuàng)建。
下表列出了?BinaryWriter?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public override void Close() 關(guān)閉 BinaryWriter 對(duì)象和基礎(chǔ)流。 |
2 | public virtual void Flush() 清理當(dāng)前編寫(xiě)器的所有緩沖區(qū),使得所有緩沖數(shù)據(jù)寫(xiě)入基礎(chǔ)設(shè)備。 |
3 | public virtual long Seek( int offset, SeekOrigin origin ) 設(shè)置當(dāng)前流內(nèi)的位置。 |
4 | public virtual void Write( bool value ) 把一個(gè)單字節(jié)的布爾值寫(xiě)入到當(dāng)前流中,0 表示 false,1 表示 true。 |
5 | public virtual void Write( byte value ) 把一個(gè)無(wú)符號(hào)字節(jié)寫(xiě)入到當(dāng)前流中,并把流的位置往前移一個(gè)字節(jié)。 |
6 | public virtual void Write( byte[] buffer ) 把一個(gè)字節(jié)數(shù)組寫(xiě)入到基礎(chǔ)流中。 |
7 | public virtual void Write( char ch ) 把一個(gè) Unicode 字符寫(xiě)入到當(dāng)前流中,并把流的當(dāng)前位置按照所使用的編碼和要寫(xiě)入到流中的指定的字符往前移。 |
8 | public virtual void Write( char[] chars ) 把一個(gè)字符數(shù)組寫(xiě)入到當(dāng)前流中,并把流的當(dāng)前位置按照所使用的編碼和要寫(xiě)入到流中的指定的字符往前移。 |
9 | public virtual void Write( double value ) 把一個(gè) 8 字節(jié)浮點(diǎn)值寫(xiě)入到當(dāng)前流中,并把流位置往前移八個(gè)字節(jié)。 |
10 | public virtual void Write( int value ) 把一個(gè) 4 字節(jié)有符號(hào)整數(shù)寫(xiě)入到當(dāng)前流中,并把流位置往前移四個(gè)字節(jié)。 |
11 | public virtual void Write( string value ) 把一個(gè)以長(zhǎng)度為前綴的字符串寫(xiě)入到 BinaryWriter 的當(dāng)前編碼的流中,并把流的當(dāng)前位置按照所使用的編碼和要寫(xiě)入到流中的指定的字符往前移。 |
如需查看完整的方法列表,請(qǐng)?jiān)L問(wèn)微軟的 C# 文檔。
實(shí)例
using System;
using System.IO;class Program
{static void Main(){string filePath = "D:/binaryfile.dat";// 使用 BinaryWriter 寫(xiě)入二進(jìn)制文件using (BinaryWriter writer = new BinaryWriter(File.Open(filePath, FileMode.Create))){double value1 = 3.14159;int value2 = 42;writer.Write(value1);writer.Write(value2);}// 使用 BinaryReader 讀取二進(jìn)制文件using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open))){double readValue1 = reader.ReadDouble();int readValue2 = reader.ReadInt32();Console.WriteLine("從二進(jìn)制文件讀取: " + readValue1 + ", " + readValue2);}}
}
在這個(gè)示例中,我們首先使用 BinaryWriter 打開(kāi)文件并寫(xiě)入一個(gè) double 值和一個(gè) int 值。然后使用 BinaryReader 打開(kāi)同一個(gè)文件,并按照寫(xiě)入的順序讀取相應(yīng)類(lèi)型的數(shù)據(jù),并將其輸出到控制臺(tái)。
使用 BinaryWriter 和 BinaryReader 可以實(shí)現(xiàn)對(duì)二進(jìn)制文件的靈活讀寫(xiě)操作。同時(shí),using 關(guān)鍵字確保在使用完成后正確地關(guān)閉文件流,釋放資源。
Windows 文件系統(tǒng)的操作
C# 允許您使用各種目錄和文件相關(guān)的類(lèi)來(lái)操作目錄和文件,比如?DirectoryInfo?類(lèi)和?FileInfo?類(lèi)。
DirectoryInfo 類(lèi)
DirectoryInfo?類(lèi)派生自?FileSystemInfo?類(lèi)。它提供了各種用于創(chuàng)建、移動(dòng)、瀏覽目錄和子目錄的方法。該類(lèi)不能被繼承。
下表列出了?DirectoryInfo?類(lèi)中一些常用的屬性:
序號(hào) | 屬性 & 描述 |
---|---|
1 | Attributes 獲取當(dāng)前文件或目錄的屬性。 |
2 | CreationTime 獲取當(dāng)前文件或目錄的創(chuàng)建時(shí)間。 |
3 | Exists 獲取一個(gè)表示目錄是否存在的布爾值。 |
4 | Extension 獲取表示文件存在的字符串。 |
5 | FullName 獲取目錄或文件的完整路徑。 |
6 | LastAccessTime 獲取當(dāng)前文件或目錄最后被訪問(wèn)的時(shí)間。 |
7 | Name 獲取該 DirectoryInfo 實(shí)例的名稱。 |
下表列出了?DirectoryInfo?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public void Create() 創(chuàng)建一個(gè)目錄。 |
2 | public DirectoryInfo CreateSubdirectory( string path ) 在指定的路徑上創(chuàng)建子目錄。指定的路徑可以是相對(duì)于 DirectoryInfo 類(lèi)的實(shí)例的路徑。 |
3 | public override void Delete() 如果為空的,則刪除該 DirectoryInfo。 |
4 | public DirectoryInfo[] GetDirectories() 返回當(dāng)前目錄的子目錄。 |
5 | public FileInfo[] GetFiles() 從當(dāng)前目錄返回文件列表。 |
如需查看完整的屬性和方法列表,請(qǐng)?jiān)L問(wèn)微軟的C# 文檔。
FileInfo 類(lèi)
FileInfo?類(lèi)派生自?FileSystemInfo?類(lèi)。它提供了用于創(chuàng)建、復(fù)制、刪除、移動(dòng)、打開(kāi)文件的屬性和方法,且有助于 FileStream 對(duì)象的創(chuàng)建。該類(lèi)不能被繼承。
下表列出了?FileInfo?類(lèi)中一些常用的屬性:
序號(hào) | 屬性 & 描述 |
---|---|
1 | Attributes 獲取當(dāng)前文件的屬性。 |
2 | CreationTime 獲取當(dāng)前文件的創(chuàng)建時(shí)間。 |
3 | Directory 獲取文件所屬目錄的一個(gè)實(shí)例。 |
4 | Exists 獲取一個(gè)表示文件是否存在的布爾值。 |
5 | Extension 獲取表示文件存在的字符串。 |
6 | FullName 獲取文件的完整路徑。 |
7 | LastAccessTime 獲取當(dāng)前文件最后被訪問(wèn)的時(shí)間。 |
8 | LastWriteTime 獲取文件最后被寫(xiě)入的時(shí)間。 |
9 | Length 獲取當(dāng)前文件的大小,以字節(jié)為單位。 |
10 | Name 獲取文件的名稱。 |
下表列出了?FileInfo?類(lèi)中一些常用的方法:
序號(hào) | 方法 & 描述 |
---|---|
1 | public StreamWriter AppendText() 創(chuàng)建一個(gè) StreamWriter,追加文本到由 FileInfo 的實(shí)例表示的文件中。 |
2 | public FileStream Create() 創(chuàng)建一個(gè)文件。 |
3 | public override void Delete() 永久刪除一個(gè)文件。 |
4 | public void MoveTo( string destFileName ) 移動(dòng)一個(gè)指定的文件到一個(gè)新的位置,提供選項(xiàng)來(lái)指定新的文件名。 |
5 | public FileStream Open( FileMode mode ) 以指定的模式打開(kāi)一個(gè)文件。 |
6 | public FileStream Open( FileMode mode, FileAccess access ) 以指定的模式,使用 read、write 或 read/write 訪問(wèn),來(lái)打開(kāi)一個(gè)文件。 |
7 | public FileStream Open( FileMode mode, FileAccess access, FileShare share ) 以指定的模式,使用 read、write 或 read/write 訪問(wèn),以及指定的分享選項(xiàng),來(lái)打開(kāi)一個(gè)文件。 |
8 | public FileStream OpenRead() 創(chuàng)建一個(gè)只讀的 FileStream。 |
9 | public FileStream OpenWrite() 創(chuàng)建一個(gè)只寫(xiě)的 FileStream。 |
如需查看完整的屬性和方法列表,請(qǐng)?jiān)L問(wèn)微軟的 C# 文檔。
實(shí)例
using System;
using System.IO;class Program
{static void Main(){string directoryPath = @"D:/C#";// 使用 DirectoryInfo 獲取目錄信息DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath);if (directoryInfo.Exists){Console.WriteLine("目錄名稱: " + directoryInfo.Name);Console.WriteLine("創(chuàng)建時(shí)間: " + directoryInfo.CreationTime);// 使用 FileInfo 遍歷文件信息FileInfo[] files = directoryInfo.GetFiles();Console.WriteLine("文件數(shù): " + files.Length);foreach (FileInfo file in files){Console.WriteLine("文件名: " + file.Name);Console.WriteLine("文件大小: " + file.Length + " 字節(jié)");Console.WriteLine("上次訪問(wèn)時(shí)間: " + file.LastAccessTime);}}else{Console.WriteLine("目錄不存在。");}}
}
在這個(gè)示例中,我們首先使用 DirectoryInfo 類(lèi)獲取指定目錄的信息,包括目錄名和創(chuàng)建時(shí)間。然后使用 GetFiles 方法獲取目錄中的所有文件信息,并遍歷輸出每個(gè)文件的名稱、大小和最后訪問(wèn)時(shí)間等信息。
通過(guò)使用 DirectoryInfo 類(lèi)和 FileInfo 類(lèi),可以方便地獲取目錄和文件的各種信息,并對(duì)其進(jìn)行操作。