c#文件讀寫(xiě)詳解_第1頁(yè)
c#文件讀寫(xiě)詳解_第2頁(yè)
c#文件讀寫(xiě)詳解_第3頁(yè)
c#文件讀寫(xiě)詳解_第4頁(yè)
已閱讀5頁(yè),還剩52頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C#讀寫(xiě)文件總結(jié)-)文件目錄操作函數(shù)和示例首先要熟悉.NET中處理文件和文件夾的操作。File類和Directory類是其中最主要的兩個(gè)類。了解它們將對(duì)后面功能的實(shí)現(xiàn)提供很大的便利。本節(jié)先對(duì)和文件系統(tǒng)相關(guān)的兩個(gè).NET類進(jìn)行簡(jiǎn)要介紹。System.IO.File類和System.lO.Filelnfo類主要提供有關(guān)文件的各種操作,在使用時(shí)需要引用System.lO命名空間。下面通過(guò)程序?qū)嵗齺?lái)介紹其主要屬性和方法。(1)文件打開(kāi)方法:File.Open()該方法的聲明如下:publicstaticFileStreamOpen(stringpath.FileModemode)下面的代碼打開(kāi)存放在c:\tempuploads口錄下名稱為newFile.txt文件,并在該文件屮寫(xiě)入hellOoprivatevoidOpenFile(){FileStream.TextFile=File.Open(@"c:\tempuploads\newFile.txt",FileMode.Append);byte〇Info={(byte)"h',(byte)'e",(byte)T,(byte)T,(byteyo1);TextFile.Write(lnfo,0,Info.Length);TextFile.Close();)(2)文件創(chuàng)建方法:File.Create()該方法的聲明如下:publicstaticFileStreamCreate(stringpath;)下面的代碼演示如何在c:\tempuploadsド創(chuàng)建名為newFile.txt的文件。山于File.Create方法默認(rèn)向所有用戶授予對(duì)新文件的完全讀/寫(xiě)訪問(wèn)權(quán)限,所以文件是用讀/寫(xiě)訪問(wèn)權(quán)限打開(kāi)的,必須關(guān)閉后才能由其他應(yīng)用程序打開(kāi)。為此,所以需要使用FileStream類的Close方法將所創(chuàng)建的文件關(guān)閉。FileStreamNewText=File.Create(@“c:\tempuploads\newFile.txt");NewText.Close();)(3)文件刪除方法:File.Delete()該方法聲明如下:publicstaticvoidDelete(stringpath);下面的代碼演示如何刪除c:\tempuploads目錄下的newFile.txt文件。privatevoidDeleteFile()(File.Delete(@Mc:\tempuploads\newFile.txtM);)(4)文件復(fù)制方法:File.Copy該方法聲明如下:publicstaticvoidCopy(stringsourceFileName,stringdestFileName.booloverwrite);下面的代碼將c:\tempuploads\newFile.txt復(fù)制到c:\tempuploads\BackUp.txt。由于C叩e方法的OverWrite參數(shù)設(shè)為true?所以如果BackUp.txt文件已存在的話,將會(huì)被復(fù)制過(guò)去的文件所覆蓋。privatevoidCopyFile()(File.Copy(@,,c:\tempuploads\newFile.txt",@,"c:\tempuploads\BackUp.txt",true);)(5)文件移動(dòng)方法:File.Move該方法聲明如下:publicstaticvoidMove(stringsourceFileName,stringdestFileName);卜.面的代碼可以將c:\tempuploads下的BackUp.txt文件移動(dòng)到c盤(pán)根目錄下。注意:只能在同一個(gè)邏輯盤(pán)下進(jìn)行文件轉(zhuǎn)移。如果試圖將C盤(pán)下的文件轉(zhuǎn)移到d盤(pán),將發(fā)生錯(cuò)誤。privatevoidMoveFile()|File.Move(@',c:\tempuploads\BackUp.txt,,,@',c:\BackUp.txt,');)(6)設(shè)置文件屬性方法:File.SetAttributes該方法聲明如下:publicstaticvoidSetAttributes(stringpath.FileAttributesfileAttributes);下面的代碼可以設(shè)置文件c:\tempuploads\newFile.txt的屬性為只讀、隱藏。privatevoidSetFile()(File.SetAttributes(@,,c:\tempuploads\newFile.txt,',FileAttributes.ReadOnly|FileAttributes.Hidden);)文件除了常用的只讀和隱藏屬性外,還有Archive(文件存檔狀態(tài)),System(系統(tǒng)文件),Temporary(臨時(shí)文件)等。關(guān)于文件屬性的詳細(xì)情況請(qǐng)參看MSDN中FileAttributes的描述。(7)判斷文件是否存在的方法:File.Exist該方法聲.明如F:publicstaticboolExists(stringpath);下面的代碼判斷是否存在c:\tempuploads\newFile.txt文件。若存在,先復(fù)制該文件,然后其刪除,最后將復(fù)制的文件移動(dòng);若不存在,則先創(chuàng)建該文件,然后打開(kāi)該文件并進(jìn)行寫(xiě)入操作,最后將文件屬性設(shè)為只讀、隱藏。if(File.Exists(@"c:\tempuploads\newFile.txt"))//判斷文件是否存在(CopyFile();//復(fù)制文件DeはeFile();//刪除文件MoveFile();〃移動(dòng)文件else|MakeFile();//生成文件OpenFile();//打開(kāi)文件SetFile();〃設(shè)置文件屬性)此外,File類對(duì)于Text文本提供了更多的支持。AppendText:將文本追加到現(xiàn)有文件CreateText:為寫(xiě)入文本創(chuàng)建或打開(kāi)新文件OpenText:打開(kāi)現(xiàn)有文本文件以進(jìn)行讀取但上述方法主要對(duì)UTF-8的編碼文本進(jìn)行操作,從而顯得不夠靈活。在這里推薦讀者使用下面的代碼對(duì)txt文件進(jìn)行操作。對(duì)txt文件進(jìn)行“讀”操作,示例代碼如下:StreamReaderTxtReader=newStreamReader(@,'c:\tempuploads\newFile.txt,,,System.Text.Encoding.Default);stringFileContent;FileContent=TxtReader.ReadEnd();TxtReader.Close();對(duì)txt文件進(jìn)行“寫(xiě)”操作,示例代碼如下:StreamWriter=newStreamWrite(@Hc:\tempuploads\newFile.txtn,System.Text.Encoding.Default);stringFileContent;TxtWriter.Write(FileContent);TxtWriter.Close();System.10.Directory類和System.DirectoryInfo類主要提供關(guān)于目錄的各種操作,使用時(shí)需要引用System」。命名空間。下面通過(guò)程序?qū)嵗齺?lái)介紹其主要屬性和方法。(1)目錄創(chuàng)建方法:Directory.CreateDirectory該方法聲明如下:publicstaticDirectoryinfoCreateDirectory(stringpath);下面的代碼演示在c:\tempuploads文件夾下創(chuàng)建名為NewDirectory的冃錄。privatevoidMakeDirectory()(Directory.CreateDirectory(@,'c:\tempuploads\NewDirectotyH);)(2)目錄屬性設(shè)置方法:Directorylnfo.Atttributesド面的代碼設(shè)置c:\tempuploads\NewDirectory目錄為只讀、隱藏。與文件屬性相同,目錄屬性也是使用FileAttributes來(lái)進(jìn)行設(shè)置的。privatevoidSetDirectory()(DirectoryinfoNewDirlnfo=newDirectorylnfo(@wc:\tempuploads\NewDirectotyM);NewDirlnfo.Atttributes=FileAttributes.ReadOnly|FileAttributes.Hidden;}(3)目錄刪除方法:Directory.Delete該方法聲明如ド:publicstaticvoidDelete(stringpath,boolrecursive);下面的代碼可以將c:\tempuploads\BackUp目錄刪除。Delete方法的第二個(gè)參數(shù)為bool類型,它可以決定是否刪除非空目錄。如果該參數(shù)值為true,將刪除整個(gè)目錄,即使該目錄下有文件或子目錄;若為false,則僅當(dāng)目錄為空時(shí)オ可刪除。privatevoidDeleteDirectory()Directory.Delete(@',c:\tempuploads\BackUp",true);)(4)目錄移動(dòng)方法:Directory.Move該方法聲明如下:publicstaticvoidMove(stringsourceDirName,stringdestDirName);下面的代碼將H錄c:\tempuploads\NewDirectory移動(dòng)至リc:\tempuploads\BackUp〇privatevoidMoveDirectory()(File.Move(@',c:\tempuploads\NewDirectory,,,@,,c:\tempuploads\BackUpH);)(5)獲取當(dāng)前目錄下的所有子目錄方法:Directory.GetDirectories該方法聲明如下:publicstaticstringQGetDirectories(stringpath;);下面的代碼讀出c:\tempuploads、目錄下的所有子目錄,并將其存儲(chǔ)到字符串?dāng)?shù)組中。privatevoidGetDirectory()(stringロDirectorys;Directorys=Directory.GetDirectories(@Hc:\tempuploadsM);}(6)獲取當(dāng)前目錄下的所有文件方法:Directory.GetFiles該方法聲明如下:publicstaticstringf]GetFiles(stringpath;);下面的代碼讀出c:\tempuploads'目錄下的所有文件,并將其存儲(chǔ)到字符串?dāng)?shù)組中。stringロFiles;Files=Directory.GetFiles(@Hc:\tempuploadsH,);}(7)判斷目錄是否存在方法:Directory.Exist該方法聲明如下:publicstaticboolExists(stringpath);下面的代碼判斷是否存在c:\tempuploads\NewDirectoryH錄。若存在,先獲取該目錄下的子目錄和文件,然后其移動(dòng),最后將移動(dòng)后的目錄刪除。若不存在,則先創(chuàng)建該目錄,然后將目錄屬性設(shè)為只讀、隱藏if(File.Exists(@"c:\tempuploads\NewDirectory"))〃判斷目錄是否存在(GetDirectory。;//獲取子目錄GetFile。;//獲取文件MoveDirectory。;//移動(dòng)目錄DeleteDirectory。;〃刪除目錄)else(MakeDirectory。;〃生成目錄SetDirectory();〃設(shè)置目錄屬性}注意:路徑有3種方式,當(dāng)前目錄下的相對(duì)路徑、當(dāng)前工作盤(pán)的相對(duì)路徑、絕對(duì)路徑。以C:\Tmp\Book為例(假定當(dāng)前工作目錄為C:\Tmp)。“Book”,“\Tmp\Book”,"C:\Tmp\Book”都表示C:\Tmp\Booko另外,在C#中“V是特殊字符,要表示它的話需要使用、”。山于這種寫(xiě)法不方便,C#語(yǔ)言提供了@對(duì)其筒化。只要在字符串前加上@即可直接使用へ。所以上面的路徑在C#中應(yīng)該表示為“Book”,@“\Tmp\Book",@"C:\Tmp\Book”。-)文件讀寫(xiě)具體方法1、使用FileStream讀寫(xiě)文件文件頭:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;讀文件核心代碼:byte[]byData=newbyte[100];char[]charData=newchar[1000];try(FileStreamsFile=newFileStream("文件路徑”,FileMode.Open);sFile.Seek(55,SeekOrigin.Begin);sFile.Read(byData,0,100);〃第一個(gè)參數(shù)是被傳進(jìn)來(lái)的字節(jié)數(shù)組,用以接受FileStream對(duì)象中的數(shù)據(jù),第2個(gè)參數(shù)是字節(jié)數(shù)組中開(kāi)始寫(xiě)入數(shù)據(jù)的位置,它通常是。,表示從數(shù)組的開(kāi)端文件中向數(shù)組寫(xiě)數(shù)據(jù),最后一個(gè)參數(shù)規(guī)定從文件讀多少字符,)catch(lOExceptione)Console.WriteLine(HAnIOexceptionhasbeenthrown!'*);Console.WriteLine(e.ToStringO);Console.ReadLine();return;)Decoderd=Encoding.UTF8.GetDecoder();d.GetChars(byData,0,byData.Length,charData,0);Console.WriteLine(charData);Console.ReadLine();寫(xiě)文件核心代碼:FileStreamfs=newFileStream(文件路徑,FileMode.Create);〃獲得字節(jié)數(shù)組byte口data=newUTF8Encoding().GetBytes(String);〃開(kāi)始寫(xiě)入fs.Write(data,O,data.Length);〃清空緩沖區(qū)、關(guān)閉流fs.Flush();fs.Close();2、使用StreamReader和StreamWriter文件頭:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;StreamReader讀取文件:StreamReaderobjReader=newStreamReader(文件路徑);stringsLine=M";ArrayListLineList=newArrayList();while(sLine!=null){sLine=objReader.ReadLine();if(sLine!=null&&!sLine.Equals(,m))LineList.Add(sLine);}objReader.Close();returnLineList;StreamWriter寫(xiě)文件:FileStreamfs=newFileStream(文件路徑,FileMode.Create);StreamWritersw=newStreamWriter(fs);〃開(kāi)始寫(xiě)入sw.Write(String);〃清空緩沖區(qū)sw.Flush();〃關(guān)閉流sw.Close();fs.Close();方式ー:用FileStream〃實(shí)例化一個(gè)保存文件對(duì)話框SaveFileDialogsf=newSaveFileDialog();〃設(shè)置文件保存類型sf.Filter="txt文件 所有文件|*.件〃如果用戶沒(méi)有輸入擴(kuò)展名,自動(dòng)追加后綴sf.AddExtension=true;〃設(shè)置標(biāo)題sf.Title="寫(xiě)文件";〃如果用戶點(diǎn)擊了保存按鈕if(sf.ShowDialog()==DialogResult.OK)(〃實(shí)例化ー個(gè)文件流-一》與寫(xiě)入文件相關(guān)聯(lián)FileStreamfs=newFileStream(sf.FileName,FileMode.Create);〃獲得字節(jié)數(shù)組byte[]data=newUTF8Encoding().GetBytes(this.textBox1.Text);〃開(kāi)始寫(xiě)入fs.Write(data,O,data.Length);〃清空緩沖區(qū)、關(guān)閉流fs.Flush();fs.Close();)方式二:用StreamWriter〃實(shí)例化一個(gè)保存文件對(duì)話框SaveFileDialogsf=newSaveFileDialog();〃設(shè)置文件保存類型sf.Filter="txt文件|*.txt|所有文件〃如果用戶沒(méi)有輸入擴(kuò)展名,自動(dòng)追加后綴sf.AddExtension=true;〃設(shè)置標(biāo)題sf.Title="寫(xiě)文件";〃如果用戶點(diǎn)擊了保存按鈕if(sf.ShowDialog()==DialogResult.OK)(〃實(shí)例化ー個(gè)文件流-一〉與寫(xiě)入文件相關(guān)聯(lián)FileStreamfs=newFileStream(sf.FileName,FileMode.Create);〃實(shí)例化ー個(gè)StreamWHter-->與fs相關(guān)聯(lián)StreamWritersw=newStreamWriter(fs);〃開(kāi)始寫(xiě)入sw.Write(this.textBox1.Text);〃淸空緩沖區(qū)sw.Flush();〃關(guān)閉流sw.Close();fs.Close();}stringFileName=Guid.NewGuid().ToString()+M.txtM;//GUID生成唯一文件名StringBuilderckpw=newStringBuilder(ヤ憑證輸出ヾ,W800ヤ,V'001,,ぐ東風(fēng)隨州專用汽車有限公司V:+ヤF89自由項(xiàng)16ヾハ”F90審核日期:ヾう;if(!FilelO.lsFolderExists(Server.MapPath(MpzscM)))FilelO.CreaterFolder(Server.MapPathC,M),Mfile://pzsc/M);stringfilePath=Server.MapPath(',pzscH)+”\\"+FileName;System.10.StreamWritersw=newSystem.10.StreamWriter(filePath,false,Encoding.GetEncoding(”GB2312"));〃創(chuàng)建的時(shí)候需要指定編碼格式,默認(rèn)是UTF-8,中文顯示亂碼sw.WriteLine(ckpw.ToString());sw.Close();方式三:用BinaryWriter〃實(shí)例化一個(gè)保存文件對(duì)話框SaveFileDialogsf=newSaveFileDialog();〃設(shè)置文件保存類型sf.Filter="txt文件|*.txt|所有文件『.*";〃如果用戶沒(méi)有輸入擴(kuò)展名,自動(dòng)追加后綴sf.AddExtension=true;〃設(shè)置標(biāo)題sf.Title="寫(xiě)文件”;〃如果用戶點(diǎn)擊了保存按鈕if(sf.ShowDialog()==DialogResult.OK)(〃實(shí)例化ー個(gè)文件流ー一》與寫(xiě)入文件相關(guān)聯(lián)FileStreamfs=newFileStream(sf.FileName,FileMode.Create);〃實(shí)例化BinaryWriterBinaryWriterbw=newBinaryWriter(fs);bw.Write(this.textBox1.Text);〃清空緩沖區(qū)bw.Flush();〃關(guān)閉流bw.Close();fs.Close();}C#緩存流示例一一ー->用緩存流復(fù)制文件C#文件處理操作必須先導(dǎo)入命名空間:usingSystem.10;背景:使用VS2005、ー個(gè)按鈕、ー個(gè)窗體、C#緩存流、把D:\KuGoo、愛(ài)得太多.wma復(fù)制到D:'并更名為love.wma,即:D:\love.wma在按鈕的Click事件中添加如下代碼:privatevoidbutton1_Click(objectsender,EventArgse)(〃創(chuàng)建兩個(gè)文件流ー個(gè)是源文件相關(guān),另一個(gè)是要寫(xiě)入的文件FileStreamfs=newFileStream(@"D:\KuGoo、愛(ài)得太多.wma",FileMode.Open);FileStreamfs2=newFileStream(@"D:\love.wma",FileMode.Create);〃創(chuàng)建一個(gè)字節(jié)數(shù)組,作為兩者之間的媒介〃好比兩個(gè)人拿蘋(píng)果,這個(gè)字節(jié)數(shù)組就好比ー個(gè)籃子,一個(gè)人作死的把蘋(píng)果送到籃//子里面,〃而我就可以作死得拿蘋(píng)果,通過(guò)這個(gè)媒介我們互不干擾,〃不需要互相等待【她往籃子里面放了蘋(píng)果我オ可以去拿】,提高了效率byte。data=newbyte[1024];〃創(chuàng)建兩個(gè)緩沖流,與兩個(gè)文件流相關(guān)聯(lián)BufferedStreambs=newBufferedStream(fs);BufferedStreambs2=newBufferedStream(fs2);〃fs作死的讀,fs2作死的寫(xiě),直到fs沒(méi)有字節(jié)可讀fs2就不寫(xiě)了〃好比,ー個(gè)人作死的往籃子里面丟蘋(píng)果,另ー個(gè)人作死得往籃子里面拿蘋(píng)果,直到〃籃子里面沒(méi)有蘋(píng)果拿了為止〃即一〉那個(gè)人沒(méi)有蘋(píng)果往籃子里面放了while(fs.Read(data,O,data.Length)>O)(fs2.Write(data,0,data.Length);fs2.Flush();}〃關(guān)閉流,好比兩個(gè)人累了,都要休息呵呵。(n_n)〇…fs.Close();fs2.Close();}C#內(nèi)存流示例一一,用內(nèi)存流來(lái)讀取圖片C#文件處理操作必須先導(dǎo)入命名空間:usingSystem.10;背景:ー個(gè)窗體、?個(gè)pictureBox、ー個(gè)lable[沒(méi)有選擇圖片,lable的text為"圖片未選擇ッ在pictureBoxI的Click事件中添加如下代碼:privatevoidpictureBoxI_Click(objectsender,EventArgse){〃實(shí)例化一個(gè)打開(kāi)文件對(duì)話框OpenFileDialogop=newOpenFileDialog();〃設(shè)置文件的類型op.Filter="JPG圖片|*.jpg|GIF圖片「gif';〃如果用戶點(diǎn)擊了打開(kāi)按鈕、選擇了正確的圖片路徑則進(jìn)行如下操作:if(op.ShowDialog()==DialogResult.OK)(〃清空文本this.labell.Text=*,M;〃實(shí)例化一個(gè)文件流FileStreamfs=newFileStream(op.FileName,FileMode.Open);〃把文件讀取到字節(jié)數(shù)組byte[]data=newbyte[fs.Length];fs.Read(data,0,data.Length);fs.Close();〃實(shí)例化ー個(gè)內(nèi)存流ー》把從文件流中讀取的內(nèi)容[字節(jié)數(shù)組]放到內(nèi)存流中去Memorystreamms=newMemoryStream(data);〃設(shè)置圖片框pictureBoxI中的圖片this.pictureBoxI.Image=Image.FromStream(ms);}}三)通常我們讀取ー個(gè)文件使用如下的步驟:1、聲明并使用File的OpenRead實(shí)例化ー個(gè)文件流對(duì)象,就像下面這樣2、準(zhǔn)備ー個(gè)存放文件內(nèi)容的字節(jié)數(shù)組,fs.Length將得到文件的實(shí)際大小,就像下面這樣3、開(kāi)始讀了,調(diào)用ー個(gè)文件流的ー個(gè)方法讀取數(shù)據(jù)到data數(shù)組中FileStreamfs=File.OpenRead(filename);或者FileStreamfs=FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.Read);byte[]data=newbyte[fs.Length];fs.Read(data,0,data.Length);下面的方法提供了一個(gè)比上面方法更安全的方法,來(lái)保證文件被完全讀出publicstaticvoidSafeRead(Streamstream,byte[]data)(intoffset=0;intremaining=data.Length;/Z只要有剩余的字節(jié)就不停的讀while(remaining>0)(intread=stream.Read(data,offset,remaining);if(read<=0)thrownewEndOfStreamException("文件讀取到"+read.ToString()+”失敗!つ;〃減少剩余的字節(jié)數(shù)remaining-=read;//增加偏移量offset+=read;})有些情況下你不知道流實(shí)際的長(zhǎng)度,比如:網(wǎng)絡(luò)流。此時(shí)可以使用類似的方法讀取流直到流里面的數(shù)據(jù)完全讀取出來(lái)為止。我們可以先初始化一段緩存,再將流讀出來(lái)的流信息寫(xiě)到內(nèi)存流里面,就像下面這樣:publicstaticbyte[]ReadFully(Streamstream)(/Z初始化ー個(gè)32k的緩存byte[]buffer=newbyte[32768];using(MemoryStreamms=newMemoryStreamO)〃返回結(jié)果后會(huì)自動(dòng)回收調(diào)用該對(duì)象的Dispose方法釋放內(nèi)存〃不停的讀取while(true){intread=stream.Read(buffer,0,buffer.Length);//直到讀取完最后的3M數(shù)據(jù)就可以返回結(jié)果了if(read<=0)returnms.ToArrayO;ms.Write(buffer,0,read);))I雖然上面的例子都比較簡(jiǎn)單,效果也不是很明顯(大部分都是對(duì)的),也許你早就會(huì)了,沒(méi)關(guān)系這篇文章本來(lái)就是寫(xiě)給初學(xué)者的。下面的方法提供了一?種使用指定緩存長(zhǎng)度的方式讀取流,雖然在很多情況下你可以直接使用Stream.Length得到流的長(zhǎng)度,但是不是所有的流都可以得到。publicstaticbyte[]Read2Buffer(Streamstream,intBufferLen)(//如果指定的無(wú)效長(zhǎng)度的緩沖區(qū),則指定一個(gè)默認(rèn)的長(zhǎng)度作為緩存大小if(BufferLen<1)(BufferLen=0x8000;//初始化一個(gè)緩存區(qū))byte[]buffer=newbyte[BufferLen];intread=0;intblock;/Z每次從流中讀取緩存大小的數(shù)據(jù),知道讀取完所有的流為止while((block=stream.Read(buffer,read,buffer.Length-read))>0)(/Z重新設(shè)定讀取位置read+=block;/Z檢查是否到達(dá)了緩存的邊界,檢查是否還有可以讀取的信息if(read==buffer.Length)(/Z嘗試讀取ー個(gè)字節(jié)intnextByte=stream.ReadByte();/Z讀取失敗則說(shuō)明讀取完成可以返回結(jié)果if(nextByte==-l)(returnbuffer;}/Z調(diào)整數(shù)組大小準(zhǔn)備繼續(xù)讀取bytef]newBuf=newbyte[buffer.Length*2];Array.Copy(buffer,newBuf,buffer.Length);newBuf[read]=(byte)nextByte;“buffer是ー個(gè)引用(指針),這里意在重新設(shè)定buffer指針指向ー個(gè)更大的內(nèi)存buffer=newBuf;read++;))//如果緩存太大則使用ret來(lái)收縮前面while讀取的buffer,然后直接返回byte[]ret=newbyte[read];Array.Copy(bufter,ret,read);returnret;}文件讀寫(xiě)實(shí)例usingSystem;usingSystem.IO;usingSystem.Collections;namespaceTextFileReader_csharp(classClassi(staticvoidMain(string[]args)(StreamReaderobjReader=newStreamReader('^c:\\test.txt^^);stringsLine=,H,;ArrayListarrText=newArrayList();while(sLine!=null)(sLine=objReader.ReadLine();if(sLine!=null)arrText.Add(sLine);objReader.Close();foreach(stringsOutputinarrText)Console.WriteLine(sOutput);Console.ReadLine();文件讀寫(xiě)相關(guān)類介紹:文件讀寫(xiě)操作涉及的類主要是:MarshalByRefObject類:允許在支持遠(yuǎn)程處理的應(yīng)用程序中跨應(yīng)用程序域邊界訪問(wèn)對(duì)象;BinaryReader類:用特定的編碼將基元數(shù)據(jù)類型讀作二進(jìn)制值。Binarywriter類:以二進(jìn)制形式將基元類型寫(xiě)入流,并支持用特定的編碼寫(xiě)入字符串。Stream類:提供字節(jié)序列的一般視圖。FileStream類:公開(kāi)以文件為主的Stream,既支持同步讀寫(xiě)操作,也支持異步讀寫(xiě)操作。Memorystream類:創(chuàng)建其支持存儲(chǔ)區(qū)為內(nèi)存的流。BufferedStream類:給另一流上的讀寫(xiě)操作添加?個(gè)緩沖層。TextReader類:表示可讀取連續(xù)字符系列的閱讀器。Textwriter類:表示可以編寫(xiě)ー個(gè)有序字符系列的編寫(xiě)器。StreamReader類:實(shí)現(xiàn)ー個(gè)TextReader,使其以ー種特定的編碼從字節(jié)流中讀取字符。StreamWriter類:實(shí)現(xiàn)ー個(gè)TextWriter,使其以ー,種特定的編碼向流中寫(xiě)入字符。StringReader類:實(shí)現(xiàn)從字符串進(jìn)行讀取的TextReader。Stringwriter類:實(shí)現(xiàn)ー個(gè)用于將信息寫(xiě)入字符串的TextWriter。該信息存儲(chǔ)在基礎(chǔ)StringBuilder中。File類在使用它們之前最好能了解它們的繼承關(guān)系,有助于作出最合適的選擇:另外還要注意一下Fileinfo和File類的ー些方法,如Create,CreateText,Open等,有時(shí)也會(huì)帶來(lái)方便。這些類的內(nèi)容比較繁多,更多內(nèi)容還請(qǐng)參考MSDN。下面是一些常見(jiàn)的問(wèn)題及其解決方案:問(wèn)題1:如何讀寫(xiě)文本文件(并考慮不同的編碼類型);解決方案:創(chuàng)建一個(gè)FileStream對(duì)象用以引用該文件。要寫(xiě)入文件,將FileStream対象封裝在StreamWritei?對(duì)象中,使用其重載了的Write方法;要讀取文件,將FileStream對(duì)象封裝在StreamReader対象中,使用其Read或ReadLine方法;.NETFramework允許通過(guò)StreamWriter和StreamReader類操作任何流來(lái)讀寫(xiě)文本文件。當(dāng)使用Streamwriter類寫(xiě)入數(shù)據(jù)時(shí),調(diào)用它的Write方法,該方法在重我后可以支持所有常見(jiàn)的C#數(shù)據(jù)類型,包括字符串、字符、整數(shù)、浮點(diǎn)數(shù)以及十進(jìn)制數(shù)等。但Write方法總會(huì)將的得到的數(shù)據(jù)轉(zhuǎn)換為文本,如果希望將這些文本轉(zhuǎn)換回原來(lái)的數(shù)據(jù)類型,應(yīng)使用WriteLine方法,以確保每個(gè)值都處于單獨(dú)的一行上。字符串的表現(xiàn)形式取決于你使用的編碼,最常見(jiàn)的編碼類型包括下面幾種:ASCII,UTF-16,UTF-7,UTF-8。.NETFramework在System.Text命名空間中為每種編碼類型提供了一一個(gè)類。在使用StreamWriter和StreamReader類時(shí),可以指定需耍的編碼類型,或者使用默認(rèn)的UTF-8,而在讀取文本文件時(shí),則要使用StreamReader類的Read或ReadLine方法。Read方法讀取單個(gè)字符或者指定個(gè)數(shù)的字符,返回類型為字符或字符數(shù)組:ReadLine方法則返回包含整行內(nèi)容的字符串:ReadToEnd方法從當(dāng)前位置讀取至流的結(jié)尾。(更多內(nèi)容還請(qǐng)參考MSDN)寫(xiě)入文本文件的示例:using(FileStreamfs=newFileStream(fileName,FileMode.Create))(/Z創(chuàng)建一個(gè)StreamWriter對(duì)象,使用UTF-8編碼格式using(StreamWriterwriter=newStreamWriter(fs,Encoding.UTF8))|/Z分別寫(xiě)入十進(jìn)制數(shù),字符串和字符類型的數(shù)據(jù)writer.WriteLine(123.45M);writer.WriteLine("StringData");writer.WriteLine('A');))讀取文本文件的示例:H以只讀模式打開(kāi)ー個(gè)文本文件using(FileStreamfs=newFileStream(fileName,FileMode.Open))(using(StreamReaderreader=newStreamReader(fs,Encoding.UTF8))stringtext=string.Empty;while(!reader.EndOfStream)(text=reader.ReadLine();txtMessage.Text+=text+Environment.NewLine;}})問(wèn)題2:如何讀寫(xiě)二進(jìn)制文件(使用強(qiáng)數(shù)據(jù)類型);解決方案:創(chuàng)建一個(gè)FileStream對(duì)象用以引用該文件。要寫(xiě)入文件,將FileStream對(duì)象封裝在Binarywriter對(duì)象中,使用其重載了的Write方法:要讀取文件,將FileStream対象封裝在BinaryReader對(duì)象中,使用相應(yīng)數(shù)據(jù)類型的Read方法。.NETFramework允許通過(guò)BinaryWriter和BinaryReader類操作任何流來(lái)讀寫(xiě)二進(jìn)制數(shù)據(jù)。當(dāng)使用BinaryWriter類寫(xiě)入數(shù)據(jù)時(shí),調(diào)用它的Write方法,該方法在重載后可以支持所有常見(jiàn)的C#數(shù)據(jù)類型,包括字符串、字符、整數(shù)、浮點(diǎn)數(shù)以及十進(jìn)制數(shù)等,然后數(shù)據(jù)會(huì)被編碼為ー系列字節(jié)寫(xiě)入文件,也可以配置該過(guò)程中的編碼類型。在使用二進(jìn)制文件時(shí),一定要特別注意其中的數(shù)據(jù)類型。當(dāng)你讀取數(shù)據(jù)時(shí),一定要使用BinaryReader類的某種強(qiáng)類型的Read方法。例如,要讀取字符串,要使用ReadString方法。(BinaryWriter在寫(xiě)入二進(jìn)制文件時(shí)總會(huì)記錄字符串的長(zhǎng)度以避免任何可能的錯(cuò)誤)寫(xiě)入文件的示例:using(FileStreamfs=newFileStream(fileName,FileMode.Create))(using(BinaryWriterwriter=newBinaryWriter(fs)){/Z寫(xiě)入十進(jìn)制數(shù),字符串和字符writer.Write(234.56M);writer.Write("String");writer.Write('!');)}讀取文件的示例:/Z以只讀模式打開(kāi)一個(gè)二進(jìn)制文件using(FileStreamfs=newFileStream(fileName,FileMode.Open))(using(StreamReadersr=newStreamReader(fs))(MessageBox.Show("全部數(shù)據(jù):"+sr.ReadToEnd());fs.Position=0;using(BinaryReaderreader=newBinaryReader(fs))/Z選用合適的數(shù)據(jù)類型讀取數(shù)據(jù)stringmessage=reader.ReadDecimal().ToString()+Environment.NewLine;message+=reader.ReadString()+Environment.NewLine;message+=reader.ReadChar().ToString();MessageBox.Show(message);)})問(wèn)題3:如何異步讀取文件;解決方案:有時(shí)你需要讀取ー個(gè)文件但又不希望影響程序的執(zhí)行。常見(jiàn)的情況是讀取ー個(gè)存儲(chǔ)在網(wǎng)絡(luò)驅(qū)動(dòng)器上的文件。FileStream提供了對(duì)異步操作的基本支持,即它的BeginRead和EndRead方法。使用這些方法,可以在.NETFramework線程池提供的線程中讀取ー個(gè)數(shù)據(jù)塊,而無(wú)須直接與System.Threading命名空間中的線程類打交道。采用異步方式讀取文件時(shí),可以選擇每次讀取數(shù)據(jù)的大小。根據(jù)情況的不同,你可能會(huì)每次讀取很小的數(shù)據(jù)(比如,你要將數(shù)據(jù)逐塊拷貝至另ー個(gè)文件),也可能是一個(gè)相對(duì)較大的數(shù)據(jù)(比如,在程序邏輯開(kāi)始之前需要一定數(shù)量的數(shù)據(jù))。在調(diào)用BeginRead時(shí)指定要讀取數(shù)據(jù)塊的大小,同時(shí)傳入一個(gè)緩沖區(qū)(buffer)以存放數(shù)據(jù)。因?yàn)锽eginRead和EndRead需要訪問(wèn)很多相同的信息,如FileStream,buffer,數(shù)據(jù)塊大小等,因此將這些內(nèi)容封裝?個(gè)單獨(dú)的類當(dāng)中是一個(gè)好主意。下面這個(gè)類就是ー個(gè)簡(jiǎn)單的示例。AsyncProcessor類提供了StartProcess方法,調(diào)用它開(kāi)始讀取,每次讀取操作結(jié)束,〇nCompはedRead回調(diào)函數(shù)會(huì)被觸發(fā),此時(shí)可以處理數(shù)據(jù),如果還有剩余數(shù)據(jù),則開(kāi)始ー個(gè)新的讀取操作。默認(rèn)情況下,AsyncProcessor類每次讀取2KB數(shù)據(jù)。classAsyncProcessor(privateStreaminputstream;/Z每次讀取塊的大小privateintbufferSize=2048;publicintBufferSize(get{returnbufferSize;}set{bufferSize=value;}}/Z容納接收數(shù)據(jù)的緩存privatebyte[]buffer;publicAsyncProcessor(stringfileName)buffer=newbyte[bufferSize];/Z打開(kāi)文件,指定參數(shù)為true以提供對(duì)異步操作的支持inputstream=newFileStream(fileName,FileMode.Open,FileAccess.Read,FileShare.Read,bufferSize,true);)publicvoidStartProcess(){/Z開(kāi)始異步讀取文件,填充緩存區(qū)inputstream.BeginRead(buffer,0,buffer.Length,OnCompletedRead,null);}privatevoidOnCompletedRead(IAsyncResultasyncResult)(/Z已經(jīng)異步讀取ー個(gè)塊,接收數(shù)據(jù)intbytesRead=inputstream.EndRead(asyncResult);II如果沒(méi)有讀取任何字節(jié),則流已達(dá)文件結(jié)尾if(bytesRead>0)(/Z暫停以模擬対數(shù)據(jù)塊的處理Debug.WriteLine("異步線程:已讀取ー塊)Thread.Sleep(TimeSpan.FromMilliseconds(20));//開(kāi)始讀取下ー塊inputstream.BeginRead(buffer,0,buffer.Length,OnCompletedRead,null);}else(/Z結(jié)束操作Debug.WriteLine("異步線程:讀取文件結(jié)束");inputStream.Close();)))使用該類時(shí)可以這么寫(xiě):/Z開(kāi)始在另ー線程中異步讀取文件AsyncProcessorasynclO=newAsyncProcessorCtest.txt");asynclO.StartProcess();〃在主程序中,做其它事情,這里簡(jiǎn)單地循環(huán)10秒DateTimestartTime=DateTime.Now;while(DateTime.Now.Subtract(startTime).TotalSeconds<10)(Debug.WiiteLine(”主程序:正在進(jìn)行”);/Z暫停線程以模擬耗時(shí)的操作Thread.Sleep(TimeSpan.FromMilliseconds(100));}Debug.WriteLine("主程序:己完成");問(wèn)題4:如何創(chuàng)建臨時(shí)文件;解決方案:有時(shí)需要在特定用戶的臨時(shí)目錄下創(chuàng)建一個(gè)臨時(shí)文件,這要求該文件具有唯一的名稱,避免與其它程序生成的臨時(shí)文件相沖突。我們會(huì)有多種選擇。最簡(jiǎn)單的是,在程序所在目錄內(nèi)使用GUID或時(shí)間戳加上隨機(jī)值作為文件名稱。但Path類提供的方法還是可以為你節(jié)省工作量,這就是它的靜態(tài)GetTempFileName方法,它在當(dāng)前用戶的臨時(shí)冃錄下創(chuàng)建一個(gè)臨時(shí)文件(文件名稱一定是唯一的),臨時(shí)目錄通常類似于這樣:C:\DocumentsandSettings\[username]\LocalSettings'Temp。stringtempFile=Path.GetTempFileName();using(FileStreamfs=newFileStream(tempFile,FileMode.Open))(using(BinaryWriterwriter=newBinaryWriter(fs))(/Z寫(xiě)入數(shù)據(jù)writer.Write("臨時(shí)文件信息");)}//Dosomething//最后刪除臨時(shí)文件File.Delete(tempFile);問(wèn)題5:如何獲得隨機(jī)文件名;解決方案:使用Path.GetRandomFileName方法,它與GetTempFileName方法的不同之處在于它僅僅返回一個(gè)字符串但不會(huì)創(chuàng)建文件。問(wèn)題6;監(jiān)視文件系統(tǒng)的變化;解決方案:如果指定路徑內(nèi)的文件發(fā)生改變(比如文件被修改或創(chuàng)建),你希望能對(duì)此作出反應(yīng)。如果程序與其它多個(gè)程序或業(yè)務(wù)處理相關(guān),常常需要?jiǎng)?chuàng)建一個(gè)程序,并且只有文件系統(tǒng)發(fā)生變化時(shí)它オ處于活動(dòng)狀態(tài)。你可以創(chuàng)建一個(gè)這樣的程序,讓它定期區(qū)檢測(cè)指定目錄,此時(shí)會(huì)發(fā)現(xiàn)有件事情讓你苦惱:檢測(cè)得越頻繁,就會(huì)浪費(fèi)越多的系統(tǒng)資源;而檢測(cè)得越少,那么檢測(cè)到變化的時(shí)間就會(huì)越長(zhǎng)。這時(shí)可以使用FileSystemWatcher組件,指定要進(jìn)行監(jiān)視的目錄或文件,并處理其Created,Deleted,Renamed,Changed事件。要使用FileSystemWatcher組件,首先要?jiǎng)?chuàng)建它的ー個(gè)實(shí)例,然后設(shè)置下列屬性:Path:指定要監(jiān)視的目錄:Filter:指定要監(jiān)視的文件類型,如"*.txt”;NotifyFilter:指定要監(jiān)視的變化類型;FileSystemWatcher會(huì)引發(fā)四個(gè)關(guān)鍵的事件:Created,Deleted,Renamed,Changed□這些事件都在其FileSystemEventArgs參數(shù)中提供了相關(guān)文件的信息:如文件名,路徑,改變類型,Renamed事件中還可以了解到改變前的文件名和路徑。如果要禁用這些事件,則將它的EnableRaisingEvents屬性設(shè)置為false。Created,Deleted,Renamed三個(gè)事件比較容易處理,但Changed事件就得當(dāng)心了,你需要設(shè)置它的NotifyFilter屬性以指示監(jiān)視那些類型的變化。否則,程序會(huì)在文件被修改時(shí)淹沒(méi)在不斷發(fā)生的事件中(緩存區(qū)溢出)?/Z設(shè)置相關(guān)屬性watcher.Path=appPath;watcher.Filter="*.txt";watcher.IncludeSubdirectories=true;//添加事件處理函數(shù)watcher.Created+=newFileSystemEventHandler(OnChanged);watcher.Deleted+=newFileSystemEventHandler(OnChanged);watcher.Changed+=newFileSystemEventHandler(OnChanged);watcher.Renamed+=newRenamedEventHandler(OnRenamed);voidOnRenamed(objectsender,RenamedEventArgse)(stringrenamedFormat="File:{0}被重命名為txtChangedlnfo.Text=string.Format(renamedFormat,e.OldFullPath,e.FullPath);}voidOnChanged(objectsender,FileSystemEventArgse)(/Z顯示通知信息txtChangedlnfo.Text="文件:"+e.FullPath+"發(fā)生改變"+Environment.NewLine;txtChangedlnfo.Text+="改變類型:"+e.ChangeType.ToString();}問(wèn)題7:如何使用獨(dú)立存儲(chǔ)文件:解決方案:有時(shí)你需要將數(shù)據(jù)存儲(chǔ)在文件中,但對(duì)本地硬盤(pán)驅(qū)動(dòng)器卻沒(méi)有必要的權(quán)限(FilelOPermission)〇這時(shí)要用到System」〇.IsolatedStorage命名空間中的類,這些類允許你的程序在特定用戶的目錄下將數(shù)據(jù)寫(xiě)入文件而不需要直接訪問(wèn)硬盤(pán)驅(qū)動(dòng)器的權(quán)限:/Z創(chuàng)建當(dāng)前用戶的獨(dú)立存儲(chǔ)using(IsolatedStorageFilestore=IsolatedStorageFile.GetUserStoreForAssemblyO){/Z創(chuàng)建一個(gè)文件夾store.CreateDirectory(nMyFolder");/Z創(chuàng)建一個(gè)獨(dú)立存儲(chǔ)文件using(Streamfs=newlsolatedStorageFileStreamCMyFile.txt",FileMode.Create,store))(StreamWriterwriter=newStreamWriter(fs);writer.WriteLine("TestLine!'*);writer.Flush();)Debug.WriteLine("當(dāng)前大小:”+store.CurrentSize.ToString()+Environment.NewLine);Debug.WhteLine("范圍:"+store.Scope.ToString()+Environment.NewLine);stringQfiles=store.GetFileNames('**.*'^);if(files.Length>0)(Debug.WhteLine("當(dāng)前文件:'*+Environment.NewLine);foreach(stringfileinfiles)(Debug.WriteLine(file+Environment.NewLine);)))案例學(xué)習(xí):文件流FileStream綜合案例(二)本案例您將學(xué)習(xí)到:?如何通過(guò)用戶選擇文件夾,獲取文件夾信息。?如何通過(guò)用戶選擇文件,獲取文件信息。?如何通過(guò)文件流建立一個(gè)新的文本文件。?如何打開(kāi)文本文件后重新寫(xiě)文本信息流。?如何在C#中定義文件和文件夾。?文件流的資源釋放意義以及釋放資源的基本順序。?實(shí)驗(yàn)步驟(D:由圖3-9所示,從工具箱之中拖拽三個(gè)GroupBox控件到Form窗體上,text屬性分別設(shè)置為:“添加物理路徑”、“打開(kāi)文本文件”、“文本編輯區(qū)”;向第一個(gè)GroupBox控件拖拽ー個(gè)TextBox控件:再向第一個(gè)GroupBox控件拖拽ー個(gè)Button控件,text屬性設(shè)置為"選定文件夾”;向第二個(gè)GroupBox控件拖拽ー個(gè)TextBox控件;再向第二個(gè)GroupBox控件拖拽ー個(gè)Button控件,text屬性設(shè)置ガ選定文件”;向第三個(gè)GroupBox控件拖拽ー個(gè)richTextBox控件;再向窗體上非GroupBox區(qū)域拖拽ー個(gè)Button控件,text屬性設(shè)置為"保存文本文件”。圖3-9文件操作案例2界面圖?實(shí)驗(yàn)步驟(2):在類Formll里添加一個(gè)字段TypeW,int類型,代表人為的操作類型;用鼠標(biāo)雙擊所有Button控件「進(jìn)入?cs文件編輯狀態(tài)準(zhǔn)備進(jìn)行開(kāi)發(fā)。代碼加下;〃======M碼編輯======================usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.10;namespaceFi1eOptionApplication{publicpartialclassForml1:Form{publicForml1(){InitializeComponent();)〃添加變量TypeW,int類型,〇為默認(rèn),1為打開(kāi)文件夾并建立new.txt文件,2為打開(kāi)文本文件intTypeW=0;III<summary>//Z選定某個(gè)文件夾III</summary>privatevoidbuttonl_Click(objectsender,EventArgse){〃新建文件夾FolderBrowserDialogopenfolder=newFolderBrowserDialogO;if(openfolder.ShowDialog()=DialogResult.OK)textBoxl.Text=Convert.ToString(openfolder.SelectedPath);TypeW=1;))III<summary>//Z選定某個(gè)文件夾下面的文本文件III</summary>privatevoidbutton4_Click(objectsender,EventArgse){OpenFileDialogopenfile=newOpenFileDialogO;openfile.Filter="文本文件?.txt*;if(openfile.ShowDialog()==DialogResult.OK)FileStreamOpenFileStream=newFi1eStream(openfile.FileName,FileMode.Open,FileAccess.Read);StreamReadersr=newStreamReader(OpenFi1eStream,Encoding.Default);richTextBoxl.Text=sr.ReadToEndO;textBox2.Text=Convert.ToString(openfi1e.Fi1eName);OpenFileStream.Close();sr.Close();TypeW=2;))IIIくsummary〉///保存文本文件III</summary>privatevoidbutton2_Click(objectsender,EventArgse)(if(richTextBoxl.Text=string.Empty){MessageBox.Show("編輯文本文件內(nèi)容禁止為空!”,"提示信息”);return;)else(if(TypeW=1)(Fi1eStreamfs=newFi1eStream(textBoxl.Text+@"\\new.txt",Fi1eMode.Create,Fi1eAccess.ReadWrite);StreamWritersw=newStreamWriter(fs,Encoding.Default);sw.Write(richTextBoxl.Text);TypeW=0;MessageBox.Show("已經(jīng)成功的將文本文件寫(xiě)入”+textBoxl.Text+"\\new.txt之中","提示信息");〃注意:此處順序絕不可調(diào)換,為什么?【另外,為什么必須關(guān)閉線程資源?】sw.CloseO;fs.CloseO;)elseif(TypeW==2)(FileStreamfs=newFileStream(textBox2.Text,FileMode.OpenOrCreate,FileAccess.ReadWrite);StreamWritersw=newStreamWriter(fs,Encoding.Default);sw.Write(richTextBoxl.Text);TypeW=0;MessageBox.Show("己經(jīng)成功的將文本文件寫(xiě)入"+textBox2.Text+"之中","提示信息”);〃注意:此處順序絕不可調(diào)換,為什么?sw.CloseO;fs.CloseO;})))

讀寫(xiě)二進(jìn)制文件?本節(jié)學(xué)習(xí)目標(biāo):?了解二進(jìn)制文件讀取器/編寫(xiě)器?學(xué)習(xí)建立BinaryReader類的ー些主要方法?學(xué)習(xí)建立BinaryWriter類的ー些主要方法?學(xué)習(xí)通過(guò)二進(jìn)制讀寫(xiě)操作進(jìn)行圖片的存儲(chǔ)與復(fù)制?學(xué)習(xí)通過(guò)二進(jìn)制讀寫(xiě)操作實(shí)現(xiàn)圖片文件與數(shù)據(jù)庫(kù)Image類型數(shù)據(jù)的存儲(chǔ)與讀取在前面兩節(jié),讀寫(xiě)的文件都是針對(duì)文本文件。這ー節(jié),重點(diǎn)講述二進(jìn)制文件的讀寫(xiě)。什么是二進(jìn)制文件呢?小知識(shí):二進(jìn)制文件英文:Binaryfiles-包含在ASCI!及擴(kuò)展ASCII字符中編寫(xiě)的數(shù)據(jù)或程序指令的文件。計(jì)算機(jī)文件基本上分為二種:二進(jìn)制文件和ASCII(也稱純文本)文件,圖形文件及文字處理程序等計(jì)算機(jī)程序都屬于二進(jìn)制文件。這些文件含有特殊的格式及計(jì)算機(jī)代碼。ASCII則是可以用任何文字處理程序閱讀的簡(jiǎn)單文本文件。從本質(zhì)上來(lái)說(shuō)他們之間沒(méi)有什么區(qū)別,因?yàn)樗麄冊(cè)谟脖P(pán)上都有一種的存放方式ーニ進(jìn)制,但是如果要對(duì)他們有些區(qū)分的話,那可以這樣理解。我們現(xiàn)在的每個(gè)字符由一個(gè)或多個(gè)字節(jié)組成,每個(gè)字節(jié)都是用的ー128-127之間的部分?jǐn)?shù)值來(lái)表示的,也就是說(shuō),T28—127之間還有型數(shù)據(jù)沒(méi)有對(duì)應(yīng)任何字符的任何字節(jié)。如果?個(gè)文件中的毎個(gè)字節(jié)的內(nèi)容都是可以表示成字符的數(shù)據(jù),我們就可以稱這個(gè)文件為文本文件,可見(jiàn),文本文件只是:進(jìn)制文件中的ー種特例,為了與文本文件相區(qū)別,人們又把除了文本文件以外的文件稱為二進(jìn)制文件,由于很難嚴(yán)格區(qū)分文本文件和二進(jìn)制文件的概念,所以我們可以簡(jiǎn)單地認(rèn)為,如果ー個(gè)文件專門(mén)用ア存儲(chǔ)文本字符的數(shù)據(jù),沒(méi)有包含字符以外的其他數(shù)據(jù),我們就稱之為文本文件,除此之外的文件就是:進(jìn)制文件。3-4-1二進(jìn)制文件讀取器/編寫(xiě)器介紹在讀寫(xiě)二進(jìn)制文件時(shí),需要研究的讀取器/編寫(xiě)器組是BinaryReader和BinaryWriter,它們都從System.Object直接派生。這些類型可以讓我們從基層流中以簡(jiǎn)潔的二進(jìn)制格式讀取或?qū)懭腚x散數(shù)據(jù)類型。BinaryWriter類型定義了一個(gè)多次重載的Write。方法,用于把數(shù)據(jù)類型寫(xiě)入基層的流。除了Write。方法,BinaryWriter還提供了另外一些成員讓我們能獲取或設(shè)置從Stream派生的類型,并且提供了隨機(jī)數(shù)據(jù)訪問(wèn)的支持。建立讀取器/編寫(xiě)器(BinaryReader和BinaryWriter)需要注意的事項(xiàng)有兩點(diǎn):?要使用BinaryReader和BinaryWriter類?這兩個(gè)對(duì)象都需要在FileStream上創(chuàng)建小實(shí)驗(yàn):建立一個(gè)BinaryWriter對(duì)象FileStreamfilestream=newFileStream(Filename,FileMode.Create);BinaryWriterobjBinaryWriter=newBinaryWriter(filestream);類BinaryReader用特定的編碼將基元數(shù)據(jù)類型讀作二進(jìn)制值。類BinaryReader有幾個(gè)常用的方法,如表3—13所示:表3-13類BinaryReader的常用方法方法說(shuō)明Close()關(guān)閉當(dāng)前閱讀器及基礎(chǔ)流。Read()己重載。從基礎(chǔ)流中讀取字符,并提升流的當(dāng)前位置。

ReadDecimal()從當(dāng)前流中讀取十進(jìn)制數(shù)值,并將該流的當(dāng)前位置提升十六個(gè)字節(jié)。ReadByteO從當(dāng)前流中讀取下一個(gè)字節(jié),并使流的當(dāng)前位置提升1個(gè)字節(jié)。Readlntl6()從當(dāng)前流中讀取2字節(jié)有符號(hào)整數(shù),并使流的當(dāng)前位置提升2個(gè)字節(jié)。Rcadlnt32()從當(dāng)前流中讀取4字節(jié)有符號(hào)整數(shù),并使流的當(dāng)前位置提升4個(gè)字節(jié)。ReadStringO從當(dāng)前流中讀取ー個(gè)字符串。字符串有長(zhǎng)度前綴,一次7位地被編碼為整數(shù)。小實(shí)驗(yàn):建立一個(gè)BinaryReader類的ー些主要方法usingSystem;usingSystem.10;classBinaryRW(staticvoidMainO(inti=0;chart]invalidPathChars=Path.InvalidPathChars;MemoryStreammemStream=newMemoryStreamO;BinaryWriterbinWriter=newBinaryWriter(memStream);/Z寫(xiě)入內(nèi)存binWriter.Write(*Invalidfilepathcharactersare:");for(i=0;i<invalidPathChars.Length;i++)(binWriter.Write(invalidPathChars[i]);)//用作生成編寫(xiě)器的內(nèi)存流同樣作為生成讀取器的內(nèi)存流BinaryReaderbinReader=newBinaryReader(memStream);/Z設(shè)置流的起點(diǎn)memStream.Position=0;/Z從內(nèi)存中讀取數(shù)據(jù),并把數(shù)據(jù)寫(xiě)入控制臺(tái)Console.Write(binReader.ReadString());char[]memoryData=newchar[memStream.I.ength-memStream.Position];for(i=0;i<memoryData.Length;i++)(memoryData[i]=Convert.ToChar(binReader.ReadO);)Console.WriteLine(memoryData);})類BinaryWriter以二進(jìn)制形式將基元類型寫(xiě)入流,并支持用特定的編碼寫(xiě)入字符串。類BinaryWriter有幾個(gè)常用的方法,如表3—14所示:表3?14類BinaryWriter的常用方法方法說(shuō)明Close()關(guān)閉當(dāng)前的BinaryWriter和基礎(chǔ)流。Flush()清理當(dāng)前編寫(xiě)器的所有緩沖區(qū),使所有緩沖數(shù)據(jù)寫(xiě)入基礎(chǔ)設(shè)備。Write()已重載。將值寫(xiě)入當(dāng)前流。小實(shí)驗(yàn):建立一個(gè)BinaryWriter類的ー些主要方法usingSystem;usingSystem.10;classBinaryRW{staticvoidMain()(using(BinaryWriterbinWriter=newBinaryWriter(File.Open(fileName,FileMode.Create)))(binWriter.Write(aspectRatio);binWriter.Write(lookupDir);binWriter.Write(autoSaveTime);binWriter.Write(showStatusBar);)}寫(xiě)二進(jìn)制文件案例學(xué)習(xí)?本案例您將學(xué)習(xí)到:圖片文件二進(jìn)制流的讀取并顯示在圖像控件之中:如何將圖像控件圖像讀取到內(nèi)存流,并另外存儲(chǔ);saveFileDialog控件在另存文件中的作用。1.案例學(xué)習(xí):寫(xiě)二進(jìn)制文件案例——圖片的存儲(chǔ)與復(fù)制?實(shí)驗(yàn)步驟(1):由圖3-10所示,從工具箱之中拖拽MainMenu控件、SaveFileDialog控件、GroupBox控件、PictureBox控件各ー個(gè)至UForm窗體上:Form窗體的text屬性設(shè)置為“圖片處理器”;GroupBox控件的text屬性設(shè)置為"圖片顯示區(qū)";PictureBox控件的sizemode屬性設(shè)置為zoom;MainMenu控件添加菜單項(xiàng)及子項(xiàng)如表3—15所示:表3-15圖片處理器菜單控件的菜單項(xiàng)及子項(xiàng)設(shè)置菜單項(xiàng)子項(xiàng)其他屬性圖片(&P)打開(kāi)圖片(&0)快捷鍵等其他屬性根據(jù)自己設(shè)計(jì)定(下同)復(fù)制圖片(&C)關(guān)閉(&Q)

Dialog1menuStrip代碼編輯///=SystemusingSystem.Collections.GenericusingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.TextusingusingSystem.10usingInitializeComponent()<summary>GetFileBytespublicForml2()publicpartialDialog1menuStrip代碼編輯///=SystemusingSystem.Collections.GenericusingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.TextusingusingSystem.10usingInitializeComponent()<summary>GetFileBytespublicForml2()publicpartialSystem.Windows.FormsnamespaceFileOptionApp1ication圖3-10圖片處理器界面闇?實(shí)驗(yàn)步驟(2):用鼠標(biāo)雙擊主界面上菜單控件的所有菜單項(xiàng),進(jìn)入.cs文件編輯狀態(tài)準(zhǔn)備進(jìn)行開(kāi)發(fā)。代碼加Form12:Form?輸入?yún)?shù):Filename:文件名稱:*輸出參數(shù):比特流類型*返回值:byte口二進(jìn)制流?創(chuàng)建人:錢(qián)哨*創(chuàng)建日期:09-7-9*描 述:將讀取的文件轉(zhuǎn)化成為二進(jìn)制流。///<summary>III</summary>III<paramname="Filename”》打開(kāi)的圖片具體路徑及文件名稱く/param》II!くreturns)比特流類型く/returns)publicbyte[]GetFileBytes(stringFilename)(if(Filename=="*)returnnul1;try(FileStreamfileStream=newFi1eStream(Fi1

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論