(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、DirectoryInfo、Path、Encoding)
C#文件與流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Di,有需要的朋友可以參考下。
文件與流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、DirectoryInfo、Path、Encoding)
10.1、FileStream?10.1.1、定義一個流對象
Streamfs =newFileStream(@"D:\FINISH.TXT",FileMode.Open,FileAccess.Read,FileShare.Read);
說明:
Stream是父類,FileStream是子類,父類是一個抽象類,子類才是實現類。
FileMode是一個枚舉類型,它有很多值:
Open:表示該流對象應該打開現有文件,如果文件不存在,那么就會打開異常的。
CreateNew:表示創建新文件,如果文件存在,那么就會發生異常。
Create:表示創建新文件,如果文件存在,那么就會被改寫(清空再寫)。
OpenOrCreate:表示如果文件存在就打開,不存在就創建。
FileAccess:控制本流對文件的訪問權限:讀、寫、讀寫。
FileShare:當前的流在對指定文件進行訪問的時候,控制別的流對該文件的訪問權限:讀、寫、讀寫、沒有任何權限,默認情況下,外界是沒有權限來訪問該文件的,除非指定。
10.1.2、讀取文件Streamfs =newFileStream(@"D:\FINISH.TXT",FileMode.Open);
intlength = fs.Read(byte[] buffer,intoffset,intcount);
buffer:這個是字節數組,是用來存放讀取的文件的。
offset:這個是buffer中的相對于起始索引0的偏移量,也就是從offset開始存放的。
count:計劃從流文件中讀取的字節數,count不要去超越buffer的長度。
返回值:該函數返回從文件中實際讀取字節數。0<=返回值<= count
注意:
對于Read函數,只要流沒有關閉它所指向的文件,那么第一次讀取是從第一個字節開始的,第二次讀取從第一次讀取的最后一個字節的下一個開始,有seek會自動的將流當前指向的文件的位置往后移動,以后的讀取依次類推。
讀取文件的時候,fs有一個Length屬性,表示它所指向的文件的字節大小,即文件的總長度。
10.1.3、寫入文件Streamfs =newFileStream(@"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.4、關閉文件fs. Close()
這個是將緩沖區的內容寫入到基礎流中,并清空緩沖區,所以即使沒有Flush(),調用的時候,一樣會完成Flush()的功能;并關閉流與它所指向的文件之間的聯系,并釋放所有的與之關聯的資源。這樣這個文件就與該流沒有任何的關系了,可以繼續被別的流來訪問了。所以當流使用完畢之后一定要關閉。當流關閉之后,就不能再用之前的流對象來操作文件了,否則會出錯。
10.2、字節與整數、浮點數、字符串的相互轉換在讀寫文件的時候,經常涉及到數值與字節的相互轉換、字符串與字節之間的相互轉換,下面分別來說明:
10.2.1、32位整數與字節的相互轉換byte[] buffer =BitConverter.GetBytes(inta);
這個是將32位的整數(我們看到的是十進制的整數,32位是指在計算機中以二進制存放的時候,占有32個bit位)轉換成為長度為4的字節數組:32位整數表示的是二進制的32個bit位,正好對應著4個字節,在字節中,從低八位到高八位加起來正好也是32位,最低位是二的零次方,然后是二的一次方,依次類推,所以轉換的時候,首先將十進制的32位整數按照二進制轉換成32個bit位,然后按照八位進行分割,變成四個字節,分別存放到buffer中,整數的低八位存放在buffer[0],最高的八位存放在buffer[3]中,編譯調試的時候,看到的每一個字節的數字又是單個字節從二進制轉換成十進制的值。
inta =BitConverter.ToInt32(byte[] buffer,intstartIndex)
這個是將buffer中的,從startIndex開始的四個字節,按照從低八位到高八位的順序轉換成為32位的整數值,startIndex是低八位,startIndex + 3是高八位。
10.2.2、64位double與字節的相互轉換byte[] buffer =BitConverter.GetBytes(doublea);
這個是將64位的double轉換成為長度為8的字節數組,double的低八位存放在buffer[0],最高的八位存放在buffer[7]中。
doublea =BitConverter. ToDouble(byte[] buffer,intstartIndex)
這個是將buffer中的,從startIndex開始的八個字節,按照從低八位到高八位的順序轉換成為64位的double值。
10.2.3、字符串與字節的相互轉換byte[] buffer =Encoding.Default.GetBytes(stringa);
這個是將一個字符串轉換成為一個字節數組。
strings =Encoding.Default.GetString(byte[] buffer,intstartIndex,intcount);
這個是將buffer數組轉換成為字符串,startIndex是buffer中的起始索引,count是buffer中的要轉換的字節長度。
10.3、StreamWriter、StreamReader在讀寫文件的時候,經常要讀寫文本文件,在讀寫文本文件的時候有兩個類是非常方便的。
10.3.1、寫文本文件StreamWritersw =newStreamWriter(@"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.2、讀文本文件StreamReadersr =newStreamReader(@"D:\test.txt",Encoding.Default);
stringstr = sr.ReadLine();
這個函數是讀取文本文件中的某一行,并將該行后面的\r\n刪除掉,返回字符串,如果該行后面沒有\r\n,那么就直接返回該行。讀取總是從上一次讀取之后再讀取,如果讀完了所有的行,再次讀取就會返回null了。
stringstr = sr.ReadToEnd();
讀取整個文本文件的,以字符串的形式返回。
注意:最后操作完成后要關閉流。文件如果不存在,那么就會在定義的時候異常。
10.4、File該類是一個與文件有關的類,是一個靜態類,它里面的函數是靜態函數。主要提供了對文件的創建、刪除、移動、打開文件的靜態方法。
10.4.1、文件拷貝File.Copy(stringsourceFileName,stringdestFileName)
兩個參數包含完整的路徑和文件名,目標路徑中不能有與destFileName同名文件,否則會異常。
File.Copy(stringsourceFileName,stringdestFileName,booloverwrite)
前兩個參數包含完整的路徑和文件名,最后一個參數指示如果在目標路徑中有同名文件,是否覆蓋這個文件。
10.4.2、判斷文件是否存在File.Exists(stringpath);
boolisExist =File.Exists(@"c:\zwj");
如果path指定的文件還存在,那么就返回true,否則返回false
10.4.3、刪除文件File.Delete(stringpath);
刪除path指定的文件。如果存在就刪除,不存在也不會引發異常。
10.4.4、文件移動File.Move(stringsourceFileName,stringdestFileName)
兩個參數包含完整的路徑和文件名,目標路徑中不能有與destFileName同名文件,否則會異常。
10.4.5、創建文件File.Create(stringpath);
如果文件不存在,那么就創建;如果存在,且為可寫,那么就覆蓋;如果存在不可寫,那么就會發生異常。
默認情況下,新創建的文件是可讀寫的。
10.4.6、與文件有關的幾個時間File.GetCreationTime(stringpath);
這個函數是獲取文件的創建時間,返回DateTime。
File.GetLastAccessTime(stringpath);
這個函數是獲取最后一次訪問文件的時間,返回DateTime。
File.GetLastWriteTime(stringpath);
這個函數是獲取文件的最后一次的修改時間,返回DateTime。
10.5、FileInfo類該類也是一個與文件有關的類,但是該類不是一個靜態類,該類必須經過實例化之后才可以使用。
FileInfofi =newFileInfo(stringfileName);
10.5.1、復制fi.CopyTo(stringdestFileName)
目標路徑中不能有與destFileName同名文件,否則會異常。
fi.CopyTo(stringdestFileName,booloverwrite)
最后一個參數指示如果在目標路徑中有同名文件,是否覆蓋這個文件。
注意:以上兩個函數會返回FileInfo對象,這個對象是指向destFileName的。
10.5.2、刪除fi.Delete();
永久刪除文件,文件不存在也不會發生異常。
10.5.3、移動fi.MoveTo(stringdestFileName)
目標路徑中不能有與destFileName同名文件,否則會異常。
10.5.4、屬性d:\programmfile\zwj.txt
1、 CreationTime:獲取或者設置文件的創建時間。返回DateTime。
2、 LastWriteTime:最后一次的修改時間。返回DateTime。
3、 LastAcessTime:最后一次的訪問時間。返回DateTime。
4、 DirectoryName:獲取包含該文件的目錄的完整路徑的字符串:d:\programmfile
5、 FullName:獲取包括文件名的完整路徑:d:\programmfile\zwj.txt
6、 Name:獲取文件名和擴展名:zwj.txt
7、 Extension:獲取文件的擴展名:.txt
8、 Exists:指示文件是否存在,存在返回true,否則為false。
9、 IsReadOnly:獲取或者設置當前的文件是否為只讀的。是返回true,否則為false。
10、Length:返回文件的長度,以字節為單位。長整型。
11、Directory:獲取包含該文件的目錄的DirectoryInfo實例。
10.6、關于文件的總結1、不論是創建文件還是讀取文件,只要文件的路徑只是一個文件名,而沒有絕對的路徑,那么文件名默認為當前目錄下面。這個當前是可能在變化的,程序開始啟動的時候,當前肯定是exe同一級目錄下面,但是有時候程序啟動之后,再進行某些操作的時候,比如導出到excle報表,選擇了別的文件夾路徑,那么這個當前路徑就是新路徑而非exe同一級目錄了。
2、..\:這個表示當前目錄的上一級目錄。這個當前目錄像上面一樣也是可能變化的。
3、當對一個文件第一次進行寫操作的時候,首先會把文件的內容清空。
4、如果要想找到一個固定的exe文件的路徑:
Application.ExecutablePath:獲取啟動應用程序可執行文件的路徑,包括可執行文件的名稱:
E: \source\存儲過程版\PVPT\MainMenu\bin\Debug\MainMenu.EXE
Application.StartupPath:獲取啟動應用程序可執行文件的路徑,不包括可執行文件的名稱:
E: \source\存儲過程版\PVPT\MainMenu\bin\Debug(沒\)
10.7、Directory該類是一個與目錄有關的類,是一個靜態類,它里面包含了靜態函數和靜態屬性。
1、 創建目錄
Directory.CreateDirectory(stringpath);
按照path所指定的路徑去創建目錄、子目錄,返回一個指向path的DirectoryInfo對象。這里是創建目錄而非文件,不能通過"r:"創建一個邏輯盤,只能在現有的邏輯盤下面創建目錄。重復創建已經存在的目錄是不會發生異常的。任何新創建的目錄名不能與該目錄同一級目錄下的文件名同名,否則就會報錯。
2、 刪除目錄
Directory.Delete(stringpath);
這個函數是刪除目錄,這個目錄必須為空目錄,即里面不能有目錄和文件。否則異常。目錄不存在也會異常。
Directory.Delete(stringpath,boolrecursive);
這個函數是刪除目錄,當recursive為true,那么可以刪除非空目錄,否則只能刪除空目錄。目錄不存在也會異常。
3、 移動目錄
VoidDirectory.Move(stringsourceDirName,stringdestDirName)
將原目錄的內容全部移到目標目錄里面,然后將原目錄刪除。
4、 判斷目錄是否存在
Directory.Exists(stringpath);
存在返回true,否則返回false。
5、 得到目錄的創建時間:DateTime Directory.GetCreationTime(stringpath);
6、 得到目錄的最后一次訪問時間:DateTime Directory.GetLastAccessTime(stringpath)
7、 得到目錄的最后一次修改時間:DateTime Directory.GetLastWriteTime(stringpath)
8、 得到當前的執行程序所在的目錄:stringDirectory.GetCurrentDirectory(stringpath);
9、string[]Directory.GetDirectories(stringpath);
獲取指定目錄中的子目錄名稱,只是獲取指定目錄的下一級,而非下兩級或者下三級。返回的是包括目錄名在內的完整的路徑字符串數組。
10、string[]Directory.GetFiles(stringpath);
獲取指定目錄中的子文件名稱,只是獲取指定目錄的下一級,而非下兩級或者下三級。返回的是包括文件名在內的完整的路徑字符串數組。
11、stringDirectory.GetDirectoryRoot(stringpath)
獲取path執行的路徑的根目錄,卷信息,比如”d:\”,path可以是文件或者目錄
12、string[]Directory.GetLogicalDrives();
得到本系統的邏輯盤,以字符串的形式返回。如:”d:\”
13、DirectoryInfoDirectory.GetParent(stringpath);
14、 得到指定的path的父目錄,返回DirectoryInfo對象,path可以是文件和目錄。如果path是根目錄,那么就返回null。
注意:目錄最后不要加”\”
10.8、DirectoryInfo類該類也是一個與目錄有關的類,但是該類不是一個靜態類,該類必須經過實例化之后才可以使用。
DirectoryInfodi =newDirectoryInfo(@"d:\Program Files");
10.8.1、屬性1、CreationTime:獲取或者設置目錄的創建時間。返回DateTime。
2、LastWriteTime:最后一次的修改時間。返回 DateTime。
3、LastAcessTime:最后一次的訪問時間。返回 DateTime。
4、Exists:指示目錄是否存在,存在返回true,否則為false。
5、FullName:獲取目錄的完整路徑,返回string。
6、Extension:獲取目錄名的擴展名,返回string。
7、Name:不包含路徑的目錄名,即文件夾的名字,返回string。
8、Parent:獲取父目錄,如果當前目錄是根目錄,就返回null,否則返回DirectoryInfo。
9、Root:獲取當前目錄的根目錄,返回DirectoryInfo。
10.8.2、方法1、DirectoryInfodi.CreateSubdirectory(stringpath)
這個是在當前目錄的下面創建子目錄、子子目錄,返回一個新的DirectoryInfo對象。比如path:a\b\c,a前面不能有\。
2、voiddi.Delete()
這個表示刪除di指定的空目錄,如果目錄中有內容,那么會引發異常。
voiddi.Delete(bool)
如果目錄不為空,那么true表示全部刪除,false表示不刪除。如果目錄為空,不論true還是false都將直接刪除。
3、DirectoryInfo []di.GetDirectories();
返回當前目錄的下一級所有子目錄。如果沒有,返回的數組長度為0.
4、FileInfo[]di.GetFiles();
返回當前目錄的下一級所有子文件。如果沒有,返回的數組長度為0.
10.9、Path該類是一個與路徑相關的類,是一個處理路徑字符串的,它不會去識別文件或者目錄,它只會去識別字符串,然后單純的按照字符串來處理,它里面的函數全部是public static。
1、Path.ChangeExtension(stringpath,stringextension);
這個函數是用來更新擴展名的,path為完整的路徑,extension是含有簽到句點的擴展名。如果path沒有擴展名,那么就加上extension,有就直接更新。如果extension為null或者空字符串,那么會將path中的擴展名去掉。這個只是對字符串進行變換,對原文件不會有任何的影響。
2、Path.GetDirectoryName(stringpath);
path為文件或者目錄的路徑,這個是返回文件或者目錄的上一級目錄,即返回的是最后一個”\”符號之前的字符串,如果path為null或者為根目錄,那么就返回null。
3、Path.GetExtension(stringpath);
返回指定路徑的帶前導句點的擴展名。如果沒有擴展名,就返回長度為0的字符串。如果path為null就返回null。
4、Path.GetFileName(stringpath);
獲取包括擴展名在內的文件名,如果是目錄,也會當成文件處理。path如果為根目錄則返回長度為0的字符串;如果為null則返回null。
1、Path.GetFileNameWithoutExtension(stringpath);
獲取不包括擴展名在內的文件名,如果是目錄,也會當成文件處理。path如果為根目錄則返回長度為0的字符串;如果為null則返回null。
2、Path.GetFullPath(stringpath);
path為相對路徑或者絕對路徑,返回絕對路徑。
3、Path.GetPathRoot(stringpath)
獲取path的根目錄信息,如果如果path為null,那么就返回null。
10.10、小結注意:任何一個文件都有三個時間:
創建時間:這個文件的創建時間,如果把這個文件復制到另外一個路徑下面,那么文件的創建時間就發生了變化,是復制時的時間;如果對這個文件改名,那么創建時間不會發生改變。
最后一次的修改時間:這個時間指的是最后一次修改文件內容的時間。如果把這個文件復制到另外一個路徑下面,那么文件的最后一次修改時間就不會發生變化;如果對這個文件改名,那么最后一次修改時間也不會發生改變。只有修改內容才會發生變化。
最后一次的訪問時間:是最后一次訪問這個文件的時間,這個時間比較模糊。
如果用一個文件A去覆蓋同名文件B,那么B被覆蓋后,B的創建時間不變,最后一次的修改時間變成了A的最后一次修改時間。最后一次修改一個文件的時候,如果不保存,那么修改時間還是原來的時間。
C#文件與流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、directoryInfo、Path、Encoding)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
