亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

C#文件與流(FileStream、StreamWriter 、Stream

系統 2003 0

(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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一级aa 毛片高清免费看 | 图片区亚洲 | 五月天在线网站 | 亚洲国产欧美精品一区二区三区 | 国产黄色自拍视频 | 国产成人精品男人免费 | 精品久久久久久国产 | 中文字幕在线视频不卡 | 国产亚洲精品第一区在线观看 | 久久大香香蕉国产免费网站 | 久久精品亚洲精品国产欧美 | 国产午夜不卡 | 亚洲天码中字 | 国产高清精品在线 | 亚洲国产精品不卡毛片a在线 | 久草免费在线观看 | 伊人色综合久久 | 精品国产免费久久久久久 | 夜色伊人 | 日本 毛片基地-亚洲 | 男人女人真曰批的视频动态 | 国产一区二区久久 | 91久草视频 | 成人三级视频在线观看 | 久久综合九色综合97婷婷女人 | 亚洲另类精品综合 | 最新仑乱免费视频 | 久久视频精品36线视频在线观看 | 波多野结衣一区二区三区 | 亚洲精品国产专区一区 | 亚洲天堂不卡 | 中文字幕久久亚洲一区 | 在线视频久久 | 波多野结衣高清在线播放 | 国产亚洲第一伦理第一区 | 久久亚洲免费视频 | 亚洲精品中文字幕乱码一区二区 | www精品久久| 久久久综合中文字幕久久 | 欧美精品在线免费观看 | 99久久亚洲国产高清观看 |