操做文件類:File數組
操做路徑類:Path函數
操做文件夾類:Directoryspa
C#文件與流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory,有須要的朋友能夠參考下。調試
文件與流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、DirectoryInfo、Path、Encoding)
10.一、FileStream 要將字符轉換爲字節處理對象
10.1.一、定義一個流對象 索引
Stream fs =new FileStream(@"D:\FINISH.TXT",FileMode.Open,FileAccess.Read,FileShare.Read);資源
說明:字符串
Stream是父類,FileStream是子類,父類是一個抽象類,子類纔是實現類。string
FileMode是一個枚舉類型,它有不少值:it
Open:表示該流對象應該打開現有文件,若是文件不存在,那麼就會打開異常的。
CreateNew:表示建立新文件,若是文件存在,那麼就會發生異常。
Create:表示建立新文件,若是文件存在,那麼就會被改寫(清空再寫)。
OpenOrCreate:表示若是文件存在就打開,不存在就建立。
FileAccess:控制本流對文件的訪問權限:讀、寫、讀寫。
FileShare:當前的流在對指定文件進行訪問的時候,控制別的流對該文件的訪問權限:讀、寫、讀寫、沒有任何權限,默認狀況下,外界是沒有權限來訪問該文件的,除非指定。
10.1.二、讀取文件
Stream fs =new FileStream(@"D:\FINISH.TXT",FileMode.Open);
int length = fs.Read(byte[] buffer,intoffset,intcount);
buffer:這個是字節數組,是用來存放讀取的文件的。
offset:這個是buffer中的相對於起始索引0的偏移量,也就是從offset開始存放的。
count:計劃從流文件中讀取的字節數,count不要去超越buffer的長度。
返回值:該函數返回從文件中實際讀取字節數。0<=返回值<= count
注意:
對於Read函數,只要流沒有關閉它所指向的文件,那麼第一次讀取是從第一個字節開始的,第二次讀取從第一次讀取的最後一個字節的下一個開始,有seek會自動的將流當前指向的文件的位置日後移動,之後的讀取依次類推。
讀取文件的時候,fs有一個Length屬性,表示它所指向的文件的字節大小,即文件的總長度。
10.1.三、寫入文件
Stream fs =new FileStream(@"D:\FINISH.TXT",FileMode. Create);
fs.Write(byte[] buffer,intoffset,intcount);
buffer:這個是字節數組,就是將該字節數組中的數據寫入到文件中的。
offset:這個是buffer中的相對於起始索引0的偏移量,也就是從offset開始讀取buffer的。
count:從buffer中讀取的字節數,寫入到文件中,count <=buffer.length - offset。
返回值:該函數無返回值。
注意:對於Write函數,若是文件是已存在的,在第一次write以前,會將文件所有清空,而後只要流沒有關閉它所指向的文件,那麼第一次寫入文件是從文件開頭開始寫入的,第二次寫入是從第一次寫入的最後一個字節的下一個開始,有seek會自動的將流當前指向的文件的位置日後移動,之後的寫入依次類推。
這種寫入只是寫入到緩衝區中,文件中尚未,要想真的寫入文件,還必須依賴下面的函數:
fs.Flush();
這個是將緩衝區的內容寫入到基礎流中,並清空緩衝區,這樣才能夠在文件中查看到內容。只要文件沒有被關閉,就能夠不停的Write和Flush,後面的寫入是往文件末尾寫。 若是緩衝區很大,能夠Write一部分而後Flush一部分,分屢次Write和Flush。
10.1.四、關閉文件
fs.Close()
這個是將緩衝區的內容寫入到基礎流中,並清空緩衝區,因此即便沒有Flush(),調用的時候,同樣會完成Flush()的功能;並關閉流與它所指向的文件之間的聯繫,並釋放全部的與之關聯的資源。這樣這個文件就與該流沒有任何的關係了,能夠繼續被別的流來訪問了。因此當流使用完畢以後必定要關閉。當流關閉以後,就不能再用以前的流對象來操做文件了,不然會出錯。
10.二、字節與整數、浮點數、字符串的相互轉換
在讀寫文件的時候,常常涉及到數值與字節的相互轉換、字符串與字節之間的相互轉換,下面分別來講明:
10.2.一、32位整數與字節的相互轉換
byte[] buffer =BitConverter.GetBytes(int a);
這個是將32位的整數(咱們看到的是十進制的整數,32位是指在計算機中以二進制存放的時候,佔有32個bit位)轉換成爲長度爲4的字節數組:32位整數表示的是二進制的32個bit位,正好對應着4個字節,在字節中,從低八位到高八位加起來正好也是32位,最低位是二的零次方,而後是二的一次方,依次類推,因此轉換的時候,首先將十進制的32位整數按照二進制轉換成32個bit位,而後按照八位進行分割,變成四個字節,分別存放到buffer中,整數的低八位存放在buffer[0],最高的八位存放在buffer[3]中,編譯調試的時候,看到的每個字節的數字又是單個字節從二進制轉換成十進制的值。
int a =BitConverter.ToInt32(byte[] buffer,intstartIndex)
這個是將buffer中的,從startIndex開始的四個字節,按照從低八位到高八位的順序轉換成爲32位的整數值,startIndex是低八位,startIndex + 3是高八位。
10.2.二、64位double與字節的相互轉換
byte[] buffer =BitConverter.GetBytes(double a);
這個是將64位的double轉換成爲長度爲8的字節數組,double的低八位存放在buffer[0],最高的八位存放在buffer[7]中。
double a =BitConverter. ToDouble(byte[] buffer,int startIndex)
這個是將buffer中的,從startIndex開始的八個字節,按照從低八位到高八位的順序轉換成爲64位的double值。
10.2.三、字符串與字節的相互轉換
byte[] buffer =Encoding.Default.GetBytes(stringa);
這個是將一個字符串轉換成爲一個字節數組。
strings =Encoding.Default.GetString(byte[] buffer,intstartIndex,intcount);
這個是將buffer數組轉換成爲字符串,startIndex是buffer中的起始索引,count是buffer中的要轉換的字節長度。
10.三、StreamWriter、StreamReader 直接處理字符
在讀寫文件的時候,常常要讀寫文本文件,在讀寫文本文件的時候有兩個類是很是方便的。
10.3.一、寫文本文件
StreamWriter sw =new StreamWriter(@"D:\test.txt");
定義了一個StreamWriter對象以後,首先是沒有文件就建立文件,有就把文件內容清空(本節中的構造函數是這樣的,可是能夠調用其餘的重載構造函數來完成不一樣的功能)。
sw.WriteLine("123");
這個函數是將一個字符串寫入到文件的末尾,而且自動的加上\r\n換行。
sw.Write("123");
這個是將一個字符串寫入到文件的末尾,不會加\r\n換行。
注意:以上的兩個函數只是寫入到緩衝區了,可是此時去查看文件,文件仍是沒有被寫入的。
sw.Flush();
這個是將緩衝區的內容寫入到基礎流中,並清空緩衝區,這樣才能夠在文件中查看到內容。只要文件沒有被關閉,就能夠不停的Write和Flush,後面的寫入是往文件末尾寫。 若是緩衝區很大,能夠Write一部分而後Flush一部分,分屢次Write和Flush。
sw.Close()
這個是將緩衝區的內容寫入到基礎流中,並清空緩衝區,因此即便沒有Flush(),調用的時候,同樣會完成Flush()的功能;並關閉流與它所指向的文件之間的聯繫,並釋放全部的與之關聯的資源。這樣這個文件就與該流沒有任何的關係了,能夠繼續被別的流來訪問了。因此當流使用完畢以後必定要關閉。當流關閉以後,就不能再用以前的流對象來操做文件了,不然會出錯。
10.3.二、讀文本文件
StreamReader sr =new StreamReader(@"D:\test.txt",Encoding.Default);
string str = sr.ReadLine();
這個函數是讀取文本文件中的某一行,並將該行後面的\r\n刪除掉,返回字符串,若是該行後面沒有\r\n,那麼就直接返回該行。讀取老是從上一次讀取以後再讀取,若是讀完了全部的行,再次讀取就會返回null了。
string str = sr.ReadToEnd();
讀取整個文本文件的,以字符串的形式返回。
注意:最後操做完成後要關閉流。文件若是不存在,那麼就會在定義的時候異常。
10.四、File
該類是一個與文件有關的類,是一個靜態類,它裏面的函數是靜態函數。主要提供了對文件的建立、刪除、移動、打開文件的靜態方法。
10.4.一、文件拷貝
File.Copy(string sourceFileName,string destFileName)
兩個參數包含完整的路徑和文件名,目標路徑中不能有與destFileName同名文件,不然會異常。
File.Copy(string sourceFileName,string destFileName,bool overwrite)
前兩個參數包含完整的路徑和文件名,最後一個參數指示若是在目標路徑中有同名文件,是否覆蓋這個文件。
10.4.二、判斷文件是否存在
File.Exists(string path);
bool isExist =File.Exists(@"c:\zwj");
若是path指定的文件還存在,那麼就返回true,不然返回false
10.4.三、刪除文件
File.Delete(string path);
刪除path指定的文件。若是存在就刪除,不存在也不會引起異常。
10.4.四、文件移動
File.Move(string sourceFileName,string destFileName)
兩個參數包含完整的路徑和文件名,目標路徑中不能有與destFileName同名文件,不然會異常。
10.4.五、建立文件
File.Create(string path);
若是文件不存在,那麼就建立;若是存在,且爲可寫,那麼就覆蓋;若是存在不可寫,那麼就會發生異常。
默認狀況下,新建立的文件是可讀寫的。
10.4.六、與文件有關的幾個時間
File.GetCreationTime(string path);
這個函數是獲取文件的建立時間,返回DateTime。
File.GetLastAccessTime(string path);
這個函數是獲取最後一次訪問文件的時間,返回DateTime。
File.GetLastWriteTime(string path);
這個函數是獲取文件的最後一次的修改時間,返回DateTime。
10.五、FileInfo類
該類也是一個與文件有關的類,可是該類不是一個靜態類,該類必須通過實例化以後纔可使用。
FileInfo fi =new FileInfo(string fileName);
10.5.一、複製
fi.CopyTo(string destFileName)
目標路徑中不能有與destFileName同名文件,不然會異常。
fi.CopyTo(string destFileName,bool overwrite)
最後一個參數指示若是在目標路徑中有同名文件,是否覆蓋這個文件。
注意:以上兩個函數會返回FileInfo對象,這個對象是指向destFileName的。
10.5.二、刪除
fi.Delete();
永久刪除文件,文件不存在也不會發生異常。
10.5.三、移動
fi.MoveTo(string destFileName)
目標路徑中不能有與destFileName同名文件,不然會異常。
10.5.四、屬性
d:\programmfile\zwj.txt
一、 CreationTime:獲取或者設置文件的建立時間。返回DateTime。
二、 LastWriteTime:最後一次的修改時間。返回DateTime。
三、 LastAcessTime:最後一次的訪問時間。返回DateTime。
四、 DirectoryName:獲取包含該文件的目錄的完整路徑的字符串:d:\programmfile
五、 FullName:獲取包括文件名的完整路徑:d:\programmfile\zwj.txt
六、 Name:獲取文件名和擴展名:zwj.txt
七、 Extension:獲取文件的擴展名:.txt
八、 Exists:指示文件是否存在,存在返回true,不然爲false。
九、 IsReadOnly:獲取或者設置當前的文件是否爲只讀的。是返回true,不然爲false。
十、Length:返回文件的長度,以字節爲單位。長整型。
十一、Directory:獲取包含該文件的目錄的DirectoryInfo實例。
10.六、關於文件的總結
一、不管是建立文件仍是讀取文件,只要文件的路徑只是一個文件名,而沒有絕對的路徑,那麼文件名默認爲當前目錄下面。這個當前是可能在變化的,程序開始啓動的時候,當前確定是exe同一級目錄下面,可是有時候程序啓動以後,再進行某些操做的時候,好比導出到excle報表,選擇了別的文件夾路徑,那麼這個當前路徑就是新路徑而非exe同一級目錄了。
二、..\:這個表示當前目錄的上一級目錄。這個當前目錄像上面同樣也是可能變化的。
三、當對一個文件第一次進行寫操做的時候,首先會把文件的內容清空。
四、若是要想找到一個固定的exe文件的路徑:
Application.ExecutablePath:獲取啓動應用程序可執行文件的路徑,包括可執行文件的名稱:
E: \source\存儲過程版\PVPT\MainMenu\bin\Debug\MainMenu.EXE
Application.StartupPath:獲取啓動應用程序可執行文件的路徑,不包括可執行文件的名稱:
E: \source\存儲過程版\PVPT\MainMenu\bin\Debug(沒\)
10.七、Directory
該類是一個與目錄有關的類,是一個靜態類,它裏面包含了靜態函數和靜態屬性。
一、 建立目錄
Directory.CreateDirectory(string path);
按照path所指定的路徑去建立目錄、子目錄,返回一個指向path的DirectoryInfo對象。這裏是建立目錄而非文件,不能經過"r:"建立一個邏輯盤,只能在現有的邏輯盤下面建立目錄。重複建立已經存在的目錄是不會發生異常的。任何新建立的目錄名不能與該目錄同一級目錄下的文件名同名,不然就會報錯。
二、 刪除目錄
Directory.Delete(string path);
這個函數是刪除目錄,這個目錄必須爲空目錄,即裏面不能有目錄和文件。不然異常。目錄不存在也會異常。
Directory.Delete(string path,bool recursive);
這個函數是刪除目錄,當recursive爲true,那麼能夠刪除非空目錄,不然只能刪除空目錄。目錄不存在也會異常。
三、 移動目錄
VoidDirectory.Move(string sourceDirName,string destDirName)
將原目錄的內容所有移到目標目錄裏面,而後將原目錄刪除。
四、 判斷目錄是否存在
Directory.Exists(string path);
存在返回true,不然返回false。
五、 獲得目錄的建立時間:DateTime Directory.GetCreationTime(string path);
六、 獲得目錄的最後一次訪問時間:DateTime Directory.GetLastAccessTime(string path)
七、 獲得目錄的最後一次修改時間:DateTime Directory.GetLastWriteTime(string path)
八、 獲得當前的執行程序所在的目錄:string Directory.GetCurrentDirectory(string path);
九、string[] Directory.GetDirectories(string path);
獲取指定目錄中的子目錄名稱,只是獲取指定目錄的下一級,而非下兩級或者下三級。返回的是包括目錄名在內的完整的路徑字符串數組。
十、string[] Directory.GetFiles(string path);
獲取指定目錄中的子文件名稱,只是獲取指定目錄的下一級,而非下兩級或者下三級。返回的是包括文件名在內的完整的路徑字符串數組。
十一、string Directory.GetDirectoryRoot(string path)
獲取path執行的路徑的根目錄,卷信息,好比」d:\」,path能夠是文件或者目錄
十二、string[] Directory.GetLogicalDrives();
獲得本系統的邏輯盤,以字符串的形式返回。如:」d:\」
1三、DirectoryInfo Directory.GetParent(string path);
1四、 獲得指定的path的父目錄,返回DirectoryInfo對象,path能夠是文件和目錄。若是path是根目錄,那麼就返回null。
注意:目錄最後不要加」\」
10.八、DirectoryInfo類
該類也是一個與目錄有關的類,可是該類不是一個靜態類,該類必須通過實例化以後纔可使用。
DirectoryInfo di =new DirectoryInfo(@"d:\Program Files");
10.8.一、屬性
一、CreationTime:獲取或者設置目錄的建立時間。返回DateTime。
二、LastWriteTime:最後一次的修改時間。返回 DateTime。
三、LastAcessTime:最後一次的訪問時間。返回 DateTime。
四、Exists:指示目錄是否存在,存在返回true,不然爲false。
五、FullName:獲取目錄的完整路徑,返回string。
六、Extension:獲取目錄名的擴展名,返回string。
七、Name:不包含路徑的目錄名,即文件夾的名字,返回string。
八、Parent:獲取父目錄,若是當前目錄是根目錄,就返回null,不然返回DirectoryInfo。
九、Root:獲取當前目錄的根目錄,返回DirectoryInfo。
10.8.二、方法
一、DirectoryInfo di.CreateSubdirectory(string path)
這個是在當前目錄的下面建立子目錄、子子目錄,返回一個新的DirectoryInfo對象。好比path:a\b\c,a前面不能有\。
二、void di.Delete()
這個表示刪除di指定的空目錄,若是目錄中有內容,那麼會引起異常。
void di.Delete(bool)
若是目錄不爲空,那麼true表示所有刪除,false表示不刪除。若是目錄爲空,不論true仍是false都將直接刪除。
三、DirectoryInfo [] di.GetDirectories();
返回當前目錄的下一級全部子目錄。若是沒有,返回的數組長度爲0.
四、FileInfo[] di.GetFiles();
返回當前目錄的下一級全部子文件。若是沒有,返回的數組長度爲0.
10.九、Path
該類是一個與路徑相關的類,是一個處理路徑字符串的,它不會去識別文件或者目錄,它只會去識別字符串,而後單純的按照字符串來處理,它裏面的函數所有是public static。
一、Path.ChangeExtension(string path,string extension);
這個函數是用來更新擴展名的,path爲完整的路徑,extension是含有簽到句點的擴展名。若是path沒有擴展名,那麼就加上extension,有就直接更新。若是extension爲null或者空字符串,那麼會將path中的擴展名去掉。這個只是對字符串進行變換,對原文件不會有任何的影響。
二、Path.GetDirectoryName(string path);
path爲文件或者目錄的路徑,這個是返回文件或者目錄的上一級目錄,即返回的是最後一個」\」符號以前的字符串,若是path爲null或者爲根目錄,那麼就返回null。
三、Path.GetExtension(stringpath);
返回指定路徑的帶前導句點的擴展名。若是沒有擴展名,就返回長度爲0的字符串。若是path爲null就返回null。
四、Path.GetFileName(string path);
獲取包括擴展名在內的文件名,若是是目錄,也會當成文件處理。path若是爲根目錄則返回長度爲0的字符串;若是爲null則返回null。
一、Path.GetFileNameWithoutExtension(string path);
獲取不包括擴展名在內的文件名,若是是目錄,也會當成文件處理。path若是爲根目錄則返回長度爲0的字符串;若是爲null則返回null。
二、Path.GetFullPath(string path);
path爲相對路徑或者絕對路徑,返回絕對路徑。
三、Path.GetPathRoot(string path)
獲取path的根目錄信息,若是若是path爲null,那麼就返回null。
10.十、小結
注意:任何一個文件都有三個時間:
建立時間:這個文件的建立時間,若是把這個文件複製到另一個路徑下面,那麼文件的建立時間就發生了變化,是複製時的時間;若是對這個文件更名,那麼建立時間不會發生改變。
最後一次的修改時間:這個時間指的是最後一次修改文件內容的時間。若是把這個文件複製到另一個路徑下面,那麼文件的最後一次修改時間就不會發生變化;若是對這個文件更名,那麼最後一次修改時間也不會發生改變。只有修改內容纔會發生變化。
最後一次的訪問時間:是最後一次訪問這個文件的時間,這個時間比較模糊。
若是用一個文件A去覆蓋同名文件B,那麼B被覆蓋後,B的建立時間不變,最後一次的修改時間變成了A的最後一次修改時間。最後一次修改一個文件的時候,若是不保存,那麼修改時間仍是原來的時間。