C# - 文件操作
文件操作 File Operation
程序中所有數據都以流的形式進行傳輸,流分字節流和字符流。讀取文件就是輸入流,保存到文件就是輸出流,操作Unicode編碼的數據就是處理以兩個字節為單位的字符流,操作以一個字節為單位的數據就是處理字節流,前者輸入到string變量以便操作,後者則輸入到byte數組變量以便操作(byte數組的每個元素就是8個位,也即每個單位都是一個字節)。一個文檔保存的字符數據其實都是以byte進行存儲,系統會將字符的編碼(二進制的ASCII編碼或十進制的Unicode編碼)存儲到磁盤文件裏。打開文件後,可以讀取字符或字節(一個字節一個字節地讀取)。編碼類UnicodeEncoding提供兩個方法用於將字節序列轉換為字符或將字符轉換為字節序列。
UnicodeEncoding類
GetBytes(char[] charArray)//獲取字符的字節序列,返回一個byte[]數組
//示例:
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
GetString(byte[] strByte)
//示例:
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!"
encoding.GetString(strByte);
Stream類
提供對字節流的讀寫操作,它是以字節的形式操作數據。
FileStream類
提供對文件字節流的讀寫操作,它從Stream派生,同樣是以字節的形式操作數據。無構造函數,只能靠File或FileInfo類的打開文件的方法(Open()等方法)創建。
MemoryStream類
此類用於向內存讀寫數據而非向文件讀寫數據。提供對內存中的字節流的讀寫操作,它從Stream派生,同樣是以字節的形式操作數據
//寫入內存流MemoryStream memory = new MemoryStream(new byte[20]);
UnicodeEncoding unicode = new UnicodeEncoding();
byte[] strByteArray = unicode.GetBytes("hello word");//將字符串編碼為字節序列,存入字節數組
memory.Write(strByteArray, 0, strByteArray.Length);//將整個字節序列寫入內存
//讀取內存流
memory.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[memory.Length];
int count = memory.Read(byteArray, 0, strByteArray.Length);//將讀取的數據存入字節數組,返回字節總數
char[] charArray = new char[unicode.GetCharCount(byteArray, 0, count)];//解碼字節數組,將結果字符存入char數組
unicode.GetDecoder().GetChars(byteArray, 0, count, charArray, 0);
string result = new string(charArray);
Console.WriteLine(result);
Path類
Path.GetInvalidPathChars()//獲取默認的關於文件夾路徑可能的非法字符列表,返回一個char[]存儲這些內置的非法字符
Path.GetInvalidFileNameChars();
//獲取默認的關於文件路徑可能的非法字符列表,返回一個char[]存儲這些內置的非法字符
File
與FileInfo的區別在於,此類提供操作文件的靜態方法,而FileInfo需要創建實例,如果頻繁操作文件,應考慮使用FileInfo。File類沒有任何屬性,它只提供一個FileAttributes枚舉來表示文件的屬性,而FileInfo類則提供了N多個屬性來表示文件的屬性。
Open(string path, FileMode model, FileAccess access)//打開一個文件,返回一個FileStream對象。如果文件不存在則通過FileMode指定應創建該文件
//-------FileMode枚舉可能的值如下:-------
//CreateNew:創建新文件,如果文件已經存在,則引發IOException;
//Create:創建新文件,如果文件已經存在,原文件將被覆蓋;
//Open:打開現有文件,如果文件不存在,則引發FileNotFoundException;
//OpenOrCreate:打開文件,如果文件不存在,則創建新文件;
//Truncate:打開現有文件,文件一旦打開,就將截斷為零字節大小;
//Append:打開先有文件並把指針移動至文件尾,如果文件不存在將創建新文件。此枚舉值必須同FileAccess.Write一起使用
//-------FileAccess枚舉可能的值如下:-------
//Read:只讀;
//Write:只寫;
//ReadWrite:讀寫;
//示例:
FileStream stream = File.Open(@"d:/test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
stream.Write(strByte, 0, strByte.Count());
//以下兩個方法都是以只讀的方式打開文件,都返回一個FileStream對象
OpenRead、OpenWrite
//以下三個方法都是打開文件並全部讀取後關閉
ReadAllBytes、ReadAllLines、ReadAllText
//以下三個方法都是創建一個文件並全部寫入後關閉
WriteAllBytes、WriteAllLines、WriteAllText
ReadLines(String str | String str, Encoding encoding)
//讀取文件的行
//示例:
foreach (string line in File.ReadLines(@"d:\test.txt"))
{
if (line.Contains("episode") & line.Contains("2006"))
{
Console.WriteLine(line);
}
}
//此類還提供了操作文件的其它方法:
//AppendAllLines(追加)、Copy(拷貝)、Move(移動)、
//Create(創建)、Delete(刪除)、Encrypt(加密)、Decrypt(解密)
//Exists(是否存在)、Replace(用另一個文件的內容替換當前文件的內容)、
//Get / SetAttributes(設置或獲取屬性)、Get / SetCreationTime(設置或獲取創建時間)、Get / SetLastAccessTime(獲取或設置最近一次訪問的時間)
FileInfo類
除了具有File的方法以外,它提供一系列的屬性來表示文件的屬性。
Attributes//獲取或設置當前文件或目錄的特性
CreationTime
//獲取或設置當前文件或目錄的創建時間
CreationTimeUtc
//獲取或設置當前文件或目錄的創建時間,其格式為協調世界時(UTC)
Directory
//獲取父目錄的實例。
DirectoryName
//獲取表示目錄的完整路徑的字符串
Exists
//獲取指示文件是否存在的值。(覆蓋 FileSystemInfo.Exists)
Extension
//獲取表示文件擴展名部分的字符串
FullName
//獲取目錄或文件的完整目錄
IsReadOnly
//獲取或設置確定當前文件是否為只讀的值
LastAccessTime
//獲取或設置上次訪問當前文件或目錄的時間
LastAccessTimeUtc
//獲取或設置上次訪問當前文件或目錄的時間,其格式為協調世界時(UTC)
LastWriteTime
//獲取或設置上次寫入當前文件或目錄的時間
LastWriteTimeUtc
//獲取或設置上次寫入當前文件或目錄的時間,其格式為協調世界時(UTC)
Length
//獲取當前文件的大小(以字節為單位)
Name
//獲取文件名
Directory類
CreateDirectory(string path[string])//創建目錄,如果字符路徑包含子目錄名稱,將一並創建
//示例:
string path = @"e:/Animal/Person/Employee/";
DirectoryInfo dir = Directory.CreateDirectory(path);
EnumerateDirectories(string path)
//返回一個IEnumerable<string>集合,存儲了每個目錄的名稱的字符表示,類似的有DirectoryInfo的EnumerateDirectories方法,返回一個IEnumerable<DirectoryInfo>集合,存儲每個目錄的實例
//也可以使用GetDirectories,該方法返回string[],類似的有DirectoryInfo的GetDirectories,返回DirectoryInfo[]
EnumerateFiles(string path,[string search])
//返回一個IEnumerable<string>集合,存儲了當前目錄下的文件的名稱的字符表示,類似的有DirectoryInfo的EnumerateFiles方法,返回一個IEnumerable<FileInfo>集合,存儲每個文件的實例
//也可以使用GetFiles,該方法返回string[],類似的有DirectoryInfo的GetFiles,返回FileInfo[]
//示例:
string path = @"e/";
var txtFiles = Directory.EnumerateFiles(path, "*.txt");
var fileNameStr = txtFiles.Where(fileName => fileName.Contains("a"));
GetCurrentDirectory()
//獲取當前應用程序的工作目錄
GetDirectories(string path)
//返回一個string[],存儲了當前目錄的子目錄集合,類似的有DirectoryInfo的GetDirectories方法,返回一個DirectoryInfo[],存儲了當前目錄的每個子目錄的實例
GetDirectoryRoot(string path)
//返回目錄的卷信息和根信息
GetParent(string path)
//獲取當前目錄的父目錄,返回一個DirectoryInfo實例表示父目錄,類似的有DirectoryInfo的Parent屬性
SetCurrentDirectory(string path)
//將當前應用程序的工作目錄設置為參數指定的目錄
//此類還提供了操作文件的其它方法:
//Delete(刪除)、Exists(是否存在)、Move(移動)[等同於DirectoryInfo的MoveTo方法]
//Get/SetCreationTime(設置或獲取創建時間)、Get/SetLastAccessTime(最近一次訪問目錄的時間)、Get/SetLastWriteTime(最近一次寫入數據到目錄的時間)
DirectoryInfo類
除了具有Directory類的方法以外,它提供一系列的屬性來表示目錄的屬性。
Attributes//獲取或設置當前文件或目錄的特性。
CreationTime
//獲取或設置當前文件或目錄的創建時間。
CreationTimeUtc
//獲取或設置當前文件或目錄的創建時間,其格式為協調世界時(UTC)。
Exists
//獲取指示目錄是否存在的值。(覆蓋 FileSystemInfo.Exists。)
Extension
//獲取表示文件擴展名部分的字符串。
FullName
//獲取目錄的完整路徑。(覆蓋 FileSystemInfo.FullName。)
LastAccessTime
//獲取或設置上次訪問當前文件或目錄的時間。
LastAccessTimeUtc
//獲取或設置上次訪問當前文件或目錄的時間,其格式為協調世界時(UTC)。
LastWriteTime
//獲取或設置上次寫入當前文件或目錄的時間。
LastWriteTimeUtc
//獲取或設置上次寫入當前文件或目錄的時間,其格式為協調世界時(UTC)。
Name
//獲取此 DirectoryInfo 實例的名稱。(覆蓋 FileSystemInfo.Name。)
Parent
//獲取指定的子目錄的父目錄。
Root
//獲取目錄的根部分。
C# - 學習總目錄
C# - 文件操作