一、基本概念
1. 數據存儲方式對比
存儲方式 | 適用場景 | 特點 |
---|---|---|
數據庫存儲 | 大量、關系復雜、有序的數據 | 結構化強,支持復雜查詢和事務 |
文件存儲 | 少量、關系簡單的數據(如日志) | 操作簡便,可存儲于任意介質 |
2. 文件與流
文件:存儲在磁盤中,帶有指定名稱和路徑的數據集合。
流(Stream):文件讀寫時的字節序列,分為:
輸入流:從文件讀取數據(讀操作)
輸出流:向文件寫入數據(寫操作)
二、核心 I/O 類(System.IO 命名空間)
類名 | 描述 |
---|---|
BinaryReader | 從二進制流讀取原始數據 |
BinaryWriter | 以二進制格式寫入原始數據 |
BufferedStream | 字節流的臨時存儲(緩沖區),提升讀寫性能 |
Directory | 靜態類,操作目錄結構(創建、刪除、遍歷等) |
DirectoryInfo | 非靜態類,對目錄執行操作(實例化后使用,更靈活) |
DriveInfo | 提供驅動器信息(如容量、文件系統) |
File | 靜態類,操作文件(創建、刪除、讀寫等) |
FileInfo | 非靜態類,對文件執行操作(實例化后使用,適合多次操作同一文件) |
FileStream | 用于文件任意位置的讀寫(字節級操作) |
MemoryStream | 操作內存中的數據流(隨機訪問) |
Path | 處理路徑信息(拼接、解析路徑等) |
StreamReader | 從字節流讀取字符(文本文件讀操作) |
StreamWriter | 向流寫入字符(文本文件寫操作) |
三、常用類詳解
1. FileStream(字節級文件操作)
用于直接操作字節數組,處理文件的讀寫與關閉,派生自Stream
。
核心用法
構造函數:
new FileStream(路徑, FileMode, FileAccess, FileShare)
FileMode
:文件操作類型(Open
/Create
/OpenOrCreate
/Append
)FileAccess
:數據操作權限(Read
/Write
/ReadWrite
)
讀寫示例:
// 讀文件 ? using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.Read)) { ?byte[] buffer = new byte[1024]; ?int length = fs.Read(buffer, 0, buffer.Length); // 讀取字節 ?string content = Encoding.UTF8.GetString(buffer, 0, length); // 解碼 ? } ? ? // 寫文件 ? using (FileStream fs = new FileStream("test.txt", FileMode.Create, FileAccess.Write)) { ?byte[] data = Encoding.UTF8.GetBytes("Hello"); // 編碼 ?fs.Write(data, 0, data.Length); // 寫入字節 ? } ?
2. BinaryReader / BinaryWriter(二進制文件操作)
專門處理二進制文件的讀寫,簡化原始數據(如數值、字符串)的二進制轉換。
示例
// 寫二進制文件 ? using (FileStream fs = new FileStream("data.bin", FileMode.Create)) ? using (BinaryWriter bw = new BinaryWriter(fs)) { ?bw.Write(123); // 寫入整數 ?bw.Write("test"); // 寫入字符串 ? } ? ? // 讀二進制文件 ? using (FileStream fs = new FileStream("data.bin", FileMode.Open)) ? using (BinaryReader br = new BinaryReader(fs)) { ?int num = br.ReadInt32(); // 讀整數 ?string str = br.ReadString(); // 讀字符串 ? } ?
3. BufferedStream(帶緩沖區的流)
通過內存緩沖區減少對操作系統的調用,提升大數據讀寫性能。
示例
using (FileStream fs = new FileStream("bigfile.txt", FileMode.Create)) ? using (BufferedStream bs = new BufferedStream(fs)) { ?byte[] data = Encoding.UTF8.GetBytes("大量數據..."); ?bs.Write(data, 0, data.Length); // 先寫入緩沖區,滿了自動刷到文件 ?bs.Flush(); // 手動刷新緩沖區(確保數據寫入文件) ? } ?
4. File 類(靜態文件操作)
靜態類,提供創建、刪除、移動、復制文件及讀寫數據的快捷方法(適合單次操作)。
常用方法
方法 | 作用 |
---|---|
Create(string path) | 創建文件,返回FileStream |
Delete(string path) | 刪除文件 |
Move(string src, string dest) | 移動文件 |
Copy(string src, string dest) | 復制文件 |
WriteAllText(string path, string content) | 寫入字符串(覆蓋原內容) |
ReadAllText(string path) | 讀取所有內容為字符串 |
WriteAllLines(string path, string[] lines) | 按行寫入字符串數組 |
5. StreamReader / StreamWriter(文本文件操作)
專門處理字符流,自動處理編碼(默認 UTF-8),適合讀寫文本文件。
示例
// 寫文本文件 ? using (StreamWriter sw = new StreamWriter("log.txt")) { ?sw.WriteLine("第一行"); ?sw.WriteLine("第二行"); ? } ? ? // 讀文本文件 ? using (StreamReader sr = new StreamReader("log.txt")) { ?string line; ?while ((line = sr.ReadLine()) != null) { // 逐行讀取 ?Console.WriteLine(line); ?} ? } ?
6. DriveInfo(驅動器信息)
獲取計算機中驅動器的詳細信息(如容量、文件系統類型)。
常用屬性
AvailableFreeSpace
:可用空間(字節)DriveFormat
:文件系統(如 NTFS)DriveType
:驅動器類型(固定 / 移動 / CD-ROM 等)IsReady
:驅動器是否就緒
示例
DriveInfo cDrive = new DriveInfo("C:"); ? if (cDrive.IsReady) { ?Console.WriteLine($"可用空間:{cDrive.AvailableFreeSpace / 1024 / 1024} MB"); ?Console.WriteLine($"文件系統:{cDrive.DriveFormat}"); ? } ?
7. 文件屬性操作(File / FileInfo)
獲取或設置文件屬性(如只讀、隱藏),File
是靜態方法,FileInfo
是實例方法(適合多次操作)。
示例
FileInfo file = new FileInfo("test.txt"); ? file.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden; // 設置只讀+隱藏 ? Console.WriteLine($"是否只讀:{file.IsReadOnly}"); ? Console.WriteLine($"創建時間:{file.CreationTime}"); ?
8. 路徑操作(Path / Environment)
Path 類:處理路徑字符串(跨平臺兼容)。
GetDirectoryName(path)
:獲取目錄GetExtension(path)
:獲取擴展名Combine(path1, path2)
:拼接路徑GetFullPath(relativePath)
:獲取絕對路徑
Environment 類:提供系統環境信息。
CurrentDirectory
:當前工作目錄GetFolderPath(SpecialFolder)
:獲取特殊文件夾路徑(如桌面、臨時目錄)
9. 目錄操作(Directory / DirectoryInfo)
Directory
:靜態類,適合單次目錄操作。DirectoryInfo
:非靜態類,適合多次操作同一目錄。
常用方法
CreateDirectory(path)
:創建目錄(含多級)Delete(path, recursive)
:刪除目錄(recursive=true
刪除非空目錄)GetFiles(path)
:獲取目錄下所有文件GetDirectories(path)
:獲取子目錄
遞歸遍歷目錄示例
static void TraverseDir(string path) { ?foreach (string dir in Directory.GetDirectories(path)) { ?Console.WriteLine($"目錄:{dir}"); ?foreach (string file in Directory.GetFiles(dir)) { ?Console.WriteLine($"文件:{file}"); ?} ?TraverseDir(dir); // 遞歸遍歷子目錄 ?} ? } ?
四、using 語句的作用
自動釋放實現IDisposable
接口的資源(如流、文件句柄),避免手動調用Close()
和Dispose()
。
// 簡化前 ? FileStream fs = new FileStream("test.txt", FileMode.Open); ? // ... 操作 ... ? fs.Close(); ? fs.Dispose(); ? ? // 簡化后(自動釋放) ? using (FileStream fs = new FileStream("test.txt", FileMode.Open)) { ?// ... 操作 ... ? } ?
五、總結
核心類:必須掌握
File
/FileInfo
(文件)、Directory
/DirectoryInfo
(目錄)、Path
(路徑)、DriveInfo
(驅動器)。靜態 vs 非靜態:
靜態類(
File
/Directory
):適合單次操作,無需實例化。非靜態類(
FileInfo
/DirectoryInfo
/DriveInfo
):適合多次操作同一對象,更靈活。
編碼一致性:讀寫文件時需使用相同編碼(如 UTF-8),避免亂碼。
資源釋放:優先使用
using
語句,確保資源正確釋放。