歡迎來(lái)到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁(yè) 裝配圖網(wǎng) > 資源分類 > PPT文檔下載  

C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流

  • 資源ID:119792178       資源大小:330KB        全文頁(yè)數(shù):85頁(yè)
  • 資源格式: PPT        下載積分:16積分
快捷下載 游客一鍵下載
會(huì)員登錄下載
微信登錄下載
三方登錄下載: 微信開(kāi)放平臺(tái)登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要16積分
郵箱/手機(jī):
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機(jī)號(hào),方便查詢和重復(fù)下載(系統(tǒng)自動(dòng)生成)
支付方式: 支付寶    微信支付   
驗(yàn)證碼:   換一換

 
賬號(hào):
密碼:
驗(yàn)證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會(huì)被瀏覽器默認(rèn)打開(kāi),此種情況可以點(diǎn)擊瀏覽器菜單,保存網(wǎng)頁(yè)到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請(qǐng)使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無(wú)水印,預(yù)覽文檔經(jīng)過(guò)壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標(biāo)題沒(méi)有明確說(shuō)明有答案則都視為沒(méi)有答案,請(qǐng)知曉。

C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流

文件和流 本章介紹在C#語(yǔ)言中,如何處理目錄(文件夾),如何處理文件,如何使用流的概念讀寫文件。文件是用路徑來(lái)定位的,描述路徑有3種方式:絕對(duì)路徑、當(dāng)前工作盤的相對(duì)路徑、相對(duì)路徑。以C:dir1dir2為例(假定當(dāng)前工作目錄為C:dir1),C:dir1dir2為絕對(duì)路徑,dir1dir2為當(dāng)前工作盤的相對(duì)路徑,dir2為相對(duì)路徑,都表示C:dir1dir2。本章中所說(shuō)的路徑,可以是路徑的3種描述方式中的任意一種。9.1 用流讀寫文件 .Net把讀寫的文件看成是順序字節(jié)流,用抽象類Stream代表一個(gè)流。Stream類有許多派生類,例如FileStream類,以字節(jié)為單位讀寫文件;BinaryRead類和BinaryWrite類,以基本數(shù)據(jù)類型為單位讀寫文件,可以從文件直接讀寫bool、String、int16、int等基本數(shù)據(jù)類型數(shù)據(jù);StreamReader和StreamWriter類以字符或字符串為單位讀寫文件。本節(jié)首先介紹這些類的用法,然后介紹數(shù)據(jù)的序列化。使用流讀寫文件必須引入命名空間:System.IO。9.1.1 FileStream類讀寫字節(jié) 使用FileStream類可以建立文件流對(duì)象,用來(lái)打開(kāi)和關(guān)閉文件,以字節(jié)為單位讀寫文件。構(gòu)造函數(shù):public New(string path,FileMode mode,FileAccess access)path:是文件的相對(duì)路徑或絕對(duì)路徑。mode:為FileMode.Append,打開(kāi)文件并將讀寫位置移到文件尾,文件不存在則創(chuàng)建新文件,只能同F(xiàn)ileAccess.Write一起使用。FileMode.Create,創(chuàng)建新文件,如果文件已存在,文件內(nèi)容將被刪除;FileMode.CreateNew,創(chuàng)建新文件,如果文件已存在,則引發(fā)異常;FileMode.Open,打開(kāi)現(xiàn)有文件,如果文件不存在,則引發(fā)異常;FileMode.OpenOrCreate,如果文件存在,打開(kāi)文件,否則,創(chuàng)建新文件;FileMode.Truncate,打開(kāi)現(xiàn)有文件,并將文件所有內(nèi)容刪除。access:FileAccess.Read(只讀方式打開(kāi)文件)、FileAccess.Write(只寫方式打開(kāi)文件)、FileAccess.ReadWrite(讀寫方式打開(kāi)文件)。也可以沒(méi)有第三個(gè)參數(shù),默認(rèn)為FileAccess.ReadWrite。共有8個(gè)構(gòu)造函數(shù),其他構(gòu)造函數(shù)請(qǐng)用VS2005幫助系統(tǒng)查看。方法void Write(byte array,int offset,int count):將參數(shù)1指定數(shù)組中多個(gè)字節(jié)寫入流,要寫入流的第1個(gè)字節(jié)是arrayoffset,參數(shù)3為要寫入的字節(jié)數(shù)。【例9.1】寫字節(jié)數(shù)組數(shù)據(jù)到文件的程序如下,該程序?qū)⒔⑽募:/g1.bin。注意,在文件頭部必須增加如下語(yǔ)句引入命名空間 Imports System.IOusing System;using System.IO;/使用文件必須引入的命名空間class WriteFile static void Main()byte data=new byte10;/建立字節(jié)數(shù)組 for(int i=0;i10;i+)/為數(shù)組賦值 datai=(byte)i;FileStream fs=new FileStream (“d:/g1.bin”,FileMode.Create);/建立流對(duì)象 /寫data字節(jié)數(shù)組中的所有數(shù)據(jù)到文件 fs.Write(data,0,10);fs.Close()/不再使用的流對(duì)象,必須關(guān)閉。/垃圾收集器不能自動(dòng)清除流對(duì)象 方法int Read(byte array,int offset,int count):從流中讀數(shù)據(jù)寫入字節(jié)數(shù)組array,讀入的第1個(gè)字節(jié)寫入arrayoffset,參數(shù)3為要讀入的字節(jié)數(shù)。返回值為所讀字節(jié)數(shù),由于可能已讀到文件尾部,其值可能小于count,甚至為0?!纠?.2】讀一個(gè)文件所有字節(jié)到數(shù)組并在屏幕顯示的程序如下,請(qǐng)先用上例建一個(gè)文件,然后用此例讀出。using System;using System.IO;/使用文件必須引入的命名空間class ReadFile static void Main()FileStream fs=new FileStream (d:/g1.bin,FileMode.Open);byte data=new bytefs.Length;long n=fs.Read(data,0,(int)fs.Length);fs.Close();/上句n為所讀字節(jié)數(shù) Console.WriteLine(文件的內(nèi)容如下:);foreach(byte m in data)Console.Write(0,m);屬性CanRead、CanSeek、CanWrite:檢查流對(duì)象是否可以讀、定位、寫。只讀屬性。屬性Length:以字節(jié)為單位表示流對(duì)象長(zhǎng)度,即文件的長(zhǎng)度。只讀屬性。屬性Position:獲取或設(shè)置流對(duì)象當(dāng)前讀寫位置。方法long Seek(long offset,SeekOrigin origin):該方法移動(dòng)文件讀寫位置到參數(shù)2指定位置加上參數(shù)1指定偏移量處,參數(shù)2可以是SeekOrigin.Begin、SeekOrigin.End、SeekOrigin.Current,分別為開(kāi)始位置、結(jié)束位置、當(dāng)前讀寫位置?!纠纠?.3】使用方法Seek例子如下。using System;using System.IO;/使用文件必須引入的命名空間class FileStreamProperty static void Main()FileStream fs=new FileStream (“d:/g1.bin”,FileMode.Open);/無(wú)第3個(gè)參數(shù) /文件讀寫位置移到從文件尾部向前4個(gè)字節(jié) fs.Seek(-4,SeekOrigin.End);Console.WriteLine(讀寫位置:0,能定位:1,fs.Position,fs.CanSeek);Console.WriteLine(能讀:0,能寫:1,fs.CanRead,fs.CanWrite);fs.Close();注意建立流對(duì)象fs的構(gòu)造函數(shù)無(wú)第3個(gè)參數(shù),因此按讀寫方式打開(kāi)。程序運(yùn)行結(jié)果如下:讀寫位置:6,能定位:true能讀:true,能寫:true9.1.2 BinaryReader、BinaryWriter類讀寫基本數(shù)據(jù)類型 使用BinaryReader和BinaryWriter類可以從文件直接讀寫bool、String、int16、int等基本數(shù)據(jù)類型數(shù)據(jù)。常用BinaryWriter類方法如下:構(gòu)造函數(shù)BinaryWriter(Stream input):參數(shù)為FileStream類對(duì)象。方法viod Write(數(shù)據(jù)類型 Value):寫入?yún)?shù)指定的數(shù)據(jù)類型的一個(gè)數(shù)據(jù),數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,例如,int、bool、float等?!纠纠?.4】寫int類型數(shù)據(jù)程序如下:using System;using System.IO;/使用文件必須引入的命名空間class WriteFile static void Main()FileStream fs=new FileStream (d:/g1.dat,FileMode.Create);BinaryWriter w=new BinaryWriter(fs);for(int i=0;i10;i+)w.Write(i);/寫入int類型數(shù)據(jù) w.Close();常用BinaryReader類方法如下:構(gòu)造函數(shù)BinaryReader(Stream input):參數(shù)為FileStream類對(duì)象。方法ReadBoolean、ReadByte、ReadChar:返回一個(gè)指定類型數(shù)據(jù)。方法沒(méi)有參數(shù)。方法byte ReadBytes(int count):返回字節(jié)數(shù)組保存從流讀出參數(shù)指定的字節(jié)。【例9.5】讀int類型數(shù)據(jù)程序如下,先用上例建一個(gè)文件,然后用此例讀出。using System;using System.IO;/使用文件必須引入的命名空間class ReadFile static void Main()int data=new int10;FileStream fs=new FileStream (d:/g1.dat,FileMode.Open);BinaryReader r=new BinaryReader(fs);for(int i=0;i10;i+)datai=r.ReadInt32();r.Close();Console.WriteLine(文件的內(nèi)容如下:);foreach(int m in data)Console.Write(0,m);9.1.3 StreamReader和StreamWriter類讀寫字符串讀寫字符串可以用StreamReader和StreamWriter類。常用StreamWriter類方法如下:構(gòu)造函數(shù)StreamWriter(string path,bool append):path是要寫文件的路徑,如果該文件存在,并且append為false,則該文件被改寫。如果該文件存在,并且append為 true,則數(shù)據(jù)被追加到該文件中。該文件不存在,將創(chuàng)建新文件。方法void Writer(string value):將字符串寫入流。方法void Writer(char value):將字符寫入流。using System;using System.IO;class WriteFile static void Main()StreamWriter w=new StreamWriter (d:/g.text,false);w.Write(100);/100首先轉(zhuǎn)換為字符串,再寫入。/字符串之間用換行符(n或rn)分隔 w.Write(100個(gè));w.Write(“End of file”);/一個(gè)字符串為文件中的一行 w.Close();常用StreamReader類方法如下:構(gòu)造函數(shù)StreamReader(string path):參數(shù)是要讀文件的路徑。方法int Read():從流中讀取一個(gè)字符,并使讀字符位置移動(dòng)到下一個(gè)字符。返回代表讀出字符ASCII字符值的int類型整數(shù),如果沒(méi)有字符可以讀出,返回-1。如果sr是StreamReader對(duì)象,讀取一個(gè)字符的用法如下:char c=(char)sr.Read()。方法string ReadLine():從流中讀取一行字符并將數(shù)據(jù)作為字符串返回。行的定義是:兩個(gè)換行符(n或rn)之間的字符序列。返回的字符串不包含回車或換行符。【例【例9.7】讀字符串程序如下,請(qǐng)先用上例建一個(gè)文件,然后用此例讀出。using System;using System.IO;using System.Collections.Generic;class ReadFile static void Main()string sLine=;List arrText=new Liststring using(StreamReader objReader=new StreamReader(d:/g.text)do sLine=objReader.ReadLine();if(sLine!=null)arrText.Add(sLine);while(sLine!=null);Console.WriteLine(文件的內(nèi)容如下:);foreach(string m in arrText)Console.Write(0,m);程序運(yùn)行結(jié)果如下:文件的內(nèi)容如下:100100個(gè)End of file9.1.4 序列化 對(duì)于一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如數(shù)組,用以上方法存入文件,就顯得過(guò)于復(fù)雜了。為了簡(jiǎn)化這類問(wèn)題,.net提出了序列化的概念,序列化包括序列化和反序列化,所謂序列化就是把類的對(duì)象作為一個(gè)整體存入文件,反序列化則是相反的過(guò)程。.net中的許多類都支持序列化,可以用如下方法判別一個(gè)類是否支持序列化:Dictionary h=new Dictionary();/建立泛型哈希表對(duì)象Type myType=h.GetType();/如為true,支持序列化,這里myBool=truebool myBool=myType.IsSerializable;【例【例9.8】下邊的例子完成了一個(gè)哈希表對(duì)象的序列化。using System.Collections.Generic;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.Serialization;class SerialFile static void Main()Dictionary h=new Dictionary();/建立哈希表對(duì)象 h.Add(鍵1,值1);/哈希表每一個(gè)元素是一對(duì)鍵值 h.Add(“鍵2”,“值2”);/例如商品編號(hào)和商品名稱 /通過(guò)鍵值,可以很容易找到鍵值對(duì)應(yīng)的值 h.Add(鍵3,值3);序列化數(shù)據(jù) FileStream fs=new FileStream (d:/d.dat,FileMode.Create);BinaryFormatter formatter=new BinaryFormatter();formatter.Serialize(fs,h);fs.Close();反序列化數(shù)據(jù) fs=new FileStream (“d:/d.dat”,FileMode.Open)h.Clear();h=(Dictionary)formatter.Deserialize(fs);fs.Close();foreach(KeyValuePair h1 in h)Console.WriteLine(0:1;,h1.Key,h1.Value);/注意哈希表用法 運(yùn)行結(jié)果如下:鍵1:值1;鍵2:值2;鍵3:值3;【例【例9.9】自己定義的類也可以序列化,只要在類定義前增加Serializable即可,下邊例子首先定義了一個(gè)可序列化的類Person,建立若干Person類對(duì)象,存到List類對(duì)象中,并將List類對(duì)象序列化。程序如下:using System;using System.IO;using System.Collections.Generic;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.Serialization;namespace e6_1_4B Serializable public class Person private string P_name=張三;/私有字段 private int P_age=12;/P_age是私有字段 public string Name/定義屬性Namegetreturn P_name;setP_name=value;public int Age/定義屬性Agegetreturn P_age;setP_age=value;class Class1 STAThread static void Main(string args)List h=new List();Person p=new Person();h.Add(p);p=new Person();p.Name=李四;p.Age=24;h.Add(p);FileStream fs=new FileStream (“d:/d.dat”,FileMode.Create);BinaryFormatter formatter=new BinaryFormatter();formatter.Serialize(fs,h);fs.Close();fs=new FileStream(d:/d.dat,FileMode.Open);h.Clear();h=(List)formatter.Deserialize(fs);fs.Close();foreach(Person de in h)Console.WriteLine (Name=0,Age=1;,de.Name,de.Age);運(yùn)行結(jié)果如下:Name=張三,Age=12;Name=李四,Age=24;9.1.5 Stream類的其他派生類Stream類的其他派生類包括:MemoryStream、BuffereStream、NetworkStream(在System.Net.Sockets命名空間)。其中MemoryStream類把文件放到內(nèi)存中,極大地提高了文件讀寫速度。BuffereStream類為文件讀寫建立一個(gè)緩沖區(qū),寫文件先把文件存到緩沖區(qū)中,緩沖區(qū)滿了以后,才寫入物理設(shè)備。先從文件讀入較多數(shù)據(jù)到緩沖區(qū),讀文件先從緩沖區(qū)讀,緩沖區(qū)沒(méi)有所需數(shù)據(jù),才再一次從物理設(shè)備讀數(shù)據(jù)到緩沖區(qū),用這樣的方法改善文件讀寫的性能。NetworkStream類把網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)也看作流。請(qǐng)用幫助系統(tǒng)查看這些類的用法。9.2 File類和FileInfo類 .Net通過(guò)File和FileInfo類來(lái)創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開(kāi)文件。在File類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能,但File類不能建立對(duì)象。FileInfo類使用方法和File類基本相同,但FileInfo類能建立對(duì)象。在使用這兩個(gè)類時(shí)需要引用System.IO命名空間。這里重點(diǎn)介紹File類的使用方法。參見(jiàn)教科書的第193頁(yè)。以下使用例子介紹各個(gè)方法的用法。9.2.2 判斷文件是否存在 判斷文件是否存在的方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定的文件是否存在,參數(shù)path指定文件路徑。如果文件存在,返回true,如果文件不存在,或者訪問(wèn)者不具有訪問(wèn)此文件的權(quán)限,或者path描述一個(gè)目錄,返回false。下面的代碼段判斷是否存在c:Examplee1.txt文件:if(File.Exists(c:Examplee1.txt)/為處理代碼 9.2.3 刪除文件刪除文件方法:public static void Delete(string path);該方法刪除參數(shù)指定的文件,參數(shù)path指定要?jiǎng)h除的文件的路徑。【例9.10】下面的程序刪除用戶指定文件。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請(qǐng)鍵入要?jiǎng)h除文件的路徑:);string path=Console.ReadLine();if(File.Exists(path)File.Delete(path);elseConsole.WriteLine(文件不存在!);9.2.4 復(fù)制文件復(fù)制文件方法:public static void Copy(string sFName,string dFName,bool overW);該方法將參數(shù)sFName指定文件拷貝到參數(shù)destFileName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果OverW為true,而且文件名為dFName的文件已存在的話,將會(huì)被復(fù)制過(guò)去的文件所覆蓋?!纠?.11】文件復(fù)制例子如下:using System;using System.IO;class CopyFile static void Main()Console.WriteLine (請(qǐng)鍵入要拷貝的源文件的路徑:);string path=Console.ReadLine();Console.WriteLine (請(qǐng)鍵入要拷貝的目文件的路徑(包括文件名):);string path1=Console.ReadLine();if(File.Exists(path)if(!File.Exists(path1)File.Copy(path,path1,true);elseConsole.WriteLine (目的文件存在或目的路徑非法!);else Console.WriteLine(源文件不存在!);9.2.5 移動(dòng)文件 移動(dòng)文件方法:public static void Move(string sFName,string dFName);該方法將參數(shù)sFName指定文件移動(dòng)到參數(shù)dFName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果目標(biāo)文件已經(jīng)存在,或者路徑格式不對(duì),將引發(fā)異常。注意,只能在同一個(gè)邏輯盤下進(jìn)行文件轉(zhuǎn)移。如果試圖將c盤下的文件轉(zhuǎn)移到d盤,將發(fā)生錯(cuò)誤。下面的代碼可以將c:Example下的e1.txt文件移動(dòng)到c盤根目錄下。File.Move(c:ExampleBackUp.txt,c:BackUp.txt);【例9.12】FileInfo類方法MoveTo可以將一個(gè)邏輯盤的文件移到另一個(gè)邏輯盤,例子如下:using System;using System.IO;class MoveFile static void Main()Console.WriteLine (請(qǐng)鍵入要移動(dòng)的源文件的路徑:);string path=Console.ReadLine();Console.WriteLine (請(qǐng)鍵入要移動(dòng)的目文件的路徑(包括文件名):);string path1=Console.ReadLine();if(File.Exists(path)if(!File.Exists(path1)FileInfo fi=new FileInfo(path);fi.MoveTo(path1);/如在同一磁盤可使用此句替換前2句 /File.Move(path,path1);else Console.WriteLine (目的文件存在或路徑非法!);elseConsole.WriteLine(源文件不存在!);9.2.6 設(shè)置文件屬性設(shè)置文件屬性方法:public static void SetAttributes(string path,FileAttributes fileAbs);參數(shù)path指定要修改屬性的文件路徑;參數(shù)fileAbs指定要修改的文件屬性,可以是如下數(shù)值:Archive(存檔)、Compressed(壓縮文件)、Directory(目錄文件)、Encrypted(加密)、Hidden(隱藏)、Normal(普通文件)、ReadOnly(只讀文件)、System(系統(tǒng)文件)、Temporary(臨時(shí)文件)。下面代碼設(shè)置文件c:e1.txt的屬性為只讀、隱藏。File.SetAttributes(c:e1.txt,FileAttributes.ReadOnly|FileAttributes.Hidden);9.2.7 得到文件的屬性方法聲明如下:public static FileAttributes GetAttributes(string path);方法返回參數(shù)指定的文件的FileAttributes,如果未找到路徑或文件,返回-1?!纠纠?.13】得到文件的屬性例子如下:using System;using System.IO;class GetFileAttributes static void Main()Console.WriteLine(鍵入得到屬性的文件路徑:);string path=Console.ReadLine();if(File.Exists(path)FileAttributes attributes=File.GetAttributes(path);if(attributes&FileAttributes.Hidden)=FileAttributes.Hidden)Console.WriteLine(隱藏文件);elseConsole.WriteLine(不是隱藏文件);FileInfo fileInfo=new FileInfo(path);Console.WriteLine(fileInfo.FullName+文件長(zhǎng)度=+fileInfo.Length+,建立時(shí)間=+fileInfo.CreationTime);/也可用如下語(yǔ)句得到文件其他信息 Console.WriteLine(建立時(shí)間=+File.GetCreationTime(path)+最后修改時(shí)間=+File.GetLastWriteTime(path)+訪問(wèn)時(shí)間=“+File.GetLastAccessTime(path);else Console.WriteLine(文件不存在!);9.3 Directory類和DirectoryInfo類C#語(yǔ)言中通過(guò)Directory類來(lái)創(chuàng)建、復(fù)制、刪除、移動(dòng)文件夾。在Directory類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能。Directory類不能建立對(duì)象。DirectoryInfo類使用方法和Directory類基本相同,但DirectoryInfo類能建立對(duì)象。在使用這兩個(gè)類時(shí)需要引用System.IO命名空間。這里重點(diǎn)介紹Directory類的使用方法。以下使用例子介紹各個(gè)方法的用法。9.3.1 Directory類常用的方法Directory類常用的方法如下,這些方法都是靜態(tài)方法。后面將通過(guò)程序?qū)嵗齺?lái)介紹其中主要方法的使用。方法定義使用說(shuō)明DirectoryInfo CreateDirectory(string s)創(chuàng)建參數(shù)指定路徑中所有目錄和子目錄。void Delete(string path)刪除參數(shù)指定目錄。bool Exists(string path)檢查參數(shù)指定路徑的文件夾是否存在,存在,返回true。string GetCurrentDirectory()獲取應(yīng)用程序的當(dāng)前工作目錄。string GetDirectories(string s)返回字符串?dāng)?shù)組,記錄參數(shù)指定的文件夾中所有子文件夾名稱。string GetDirectoryRoot(string s)返回參數(shù)指定路徑的卷信息、根信息的字符串。string GetFiles(string s)返回字符串?dāng)?shù)組,記錄指定文件夾中所有文件名稱。string GetFileSystemEntries(string s)返回指定目錄中所有文件和子目錄名稱。string GetLogicalDrives()返回字符串?dāng)?shù)組記錄計(jì)算機(jī)所有驅(qū)動(dòng)器名稱,如A:、C:。DirectoryInfo GetParent(string s)返回參數(shù)指定路徑的父文件夾。void Move(String s1,String s2)將參數(shù)1指定文件或文件夾及包含的文件、子文件夾移動(dòng)到新位置。見(jiàn)9.3.5節(jié)。void SetCurrentDirectory(string s)將參數(shù)指定目錄設(shè)置為應(yīng)用程序當(dāng)前工作目錄。GetCreationTime()、GetLastWriteTime()、GetLastAccessTime()、SetCreationTime()、SetLastAccessTime和SetLastWriteTime 見(jiàn)9.2.1節(jié)同名函數(shù)。9.3.2 判斷目錄是否存在方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定目錄是否存在,參數(shù)path指定目錄的路徑。如果目錄存在,返回true,如果目錄不存在,或者訪問(wèn)者不具有訪問(wèn)此目錄權(quán)限,返回false。下面代碼判斷是否存在c:Dir1Dir2目錄。if(Directory.Exists(c:Dir1Dir2)/為處理代碼9.3.3 創(chuàng)建目錄創(chuàng)建目錄方法:public static DirectoryInfo CreateDirectory(string path);方法按參數(shù)path指定的路徑創(chuàng)建所有目錄及其子目錄。如果由參數(shù)path指定的目錄已存在,或者參數(shù)path指定的目錄格式不正確,將引發(fā)異常?!纠?.14】下面的程序創(chuàng)建按用戶輸入的目錄名創(chuàng)建目錄,具體程序如下:using System;using System.IO;class CreateFileDirectory static void Main()Console.WriteLine(請(qǐng)鍵入要?jiǎng)?chuàng)建目錄路徑:);string path=Console.ReadLine();if(!Directory.Exists(path)Directory.CreateDirectory(path);else Console.WriteLine(目錄已存在或目錄非法!);9.3.4 刪除目錄刪除目錄方法:public static void Delete(string path,bool recursive);該方法刪除參數(shù)path指定的目錄。方法的第二個(gè)參數(shù)為bool類型,為true可以刪除非空目錄;若為false,則僅當(dāng)目錄為空時(shí)才可刪除?!纠?.15】下面的程序刪除用戶指定目錄。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請(qǐng)鍵入要?jiǎng)h除目錄的路徑:);string path=Console.ReadLine();if(Directory.Exists(path)Directory.Delete(path);else Console.WriteLine(目錄不存在或目錄非法!);9.3.5 移動(dòng)目錄 移動(dòng)目錄方法:public static void Move(string sourceDirName,string destDirName);該方法將文件或目錄及其子目錄移到新位置,如果目標(biāo)目錄已經(jīng)存在,或者路徑格式不對(duì),將引發(fā)異常。注意,只能在同一個(gè)邏輯盤下進(jìn)行目錄轉(zhuǎn)移。如果試圖將c盤下的目錄轉(zhuǎn)移到d盤,將發(fā)生錯(cuò)誤。下面的代碼可以將目錄c:Dir1Dir2移動(dòng)到c:Dir3Dir4。Directory.Move(c:Dir1Dir2,c:Dir3Dir4);【例9.16】Directory Info類方法MoveTo可以將一個(gè)邏輯盤的目錄移到另一個(gè)邏輯盤,例子如下:using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請(qǐng)鍵入要移動(dòng)源目錄的路徑:);string path=Console.ReadLine();Console.WriteLine (請(qǐng)鍵入要移動(dòng)的目的目錄的路徑:);string path1=Console.ReadLine();if(Directory.Exists(path)if(!Directory.Exists(path1)DirectoryInfo dir=new DirectoryInfo(path);dir.MoveTo(path1);/Directory.Move(path,path1);/如2個(gè)目錄在 /同一磁盤,可用被注解語(yǔ)句替換前2句 elseConsole.WriteLine(目的目錄已存在!);elseConsole.WriteLine(源目錄不存在!);9.3.6 獲取當(dāng)前目錄下所有子目錄該 方 法 聲 明 如 下:p u b l i c s t a t i c s t r i n g GetDirectories(string path);【例【例9.17】下面的程序讀出用戶指定目錄下的所有子目錄,并將其在屏幕顯示。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請(qǐng)鍵入目錄的路徑:);string path=Console.ReadLine();if(Directory.Exists(path)string Directorys;Directorys=Directory.GetDirectories(path);foreach(string aDir in Directorys)Console.WriteLine(aDir);else Console.WriteLine(目錄不存在!);獲得所有邏輯盤符方法定義如下:string AllDrivers=Directory.GetLogicalDrives();9.3.7 獲取當(dāng)前目錄下的所有文件該方法聲明如下:public static string GetFiles(string path);【例9.18】下面的程序讀出用戶指定目錄下的所有文件名,并將文件在屏幕上顯示。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請(qǐng)鍵入目錄的路徑:);string path=Console.ReadLine();if(Directory.Exists(path)string files;files=Directory.GetFiles(path);foreach(string aFile in files)Console.WriteLine(aFile);elseConsole.WriteLine(目錄不存在!);9.3.8 設(shè)置目錄屬性與文件屬性相同,目錄屬性也是使用FileAttributes來(lái)進(jìn)行設(shè)置的。下面的代碼設(shè)置c:Dir1Dir2目錄為只讀、隱藏。DirectoryInfo DirInfo=new DirectoryInfo(c:Dir1Dir2);DirInfo.Atttributes=FileAttributes.ReadOnly|FileAttributes.Hidden;9.4 例子:查找文件本節(jié)實(shí)現(xiàn)一個(gè)查找指定路徑中指定文件的程序。9.4.1 ListView和FolderBrowserDialogListView控件可用4種不同視圖(詳細(xì)資料、大圖標(biāo)、列表、小圖標(biāo))中的一種顯示一些項(xiàng)的集合,ListView控件的外觀與Windows 資源管理器的文件列表外觀相似。其常用屬性、方法和事件如下:屬性Columns:所有列標(biāo)頭的集合,可用“ColumnHeader集合編輯器”對(duì)話框修改。屬性MultiSelect:獲取或設(shè)置一個(gè)值,該值指示是否可以選擇多個(gè)項(xiàng)。屬性SelectedIndices:獲取控件中選定項(xiàng)的索引集合。用下式得到這個(gè)集合:ListView.SelectedIndexCollection I=ListView1.SelectedIndices;I.Length為選擇了多少項(xiàng),I(0)為選擇的第1項(xiàng)的索引,I(1)為選擇的第2項(xiàng)的索引等。ListView1.Items(I(0).SubItems(0).Text表示第1個(gè)選項(xiàng)的第一個(gè)子項(xiàng)的顯示內(nèi)容。屬性SelectedItems:獲取控件中選定項(xiàng)的集合。用下式得到這個(gè)集合:ListView.SelectedListViewItemCollection L=ListView1.SelectedItems;其中L.Length表示選擇了多少項(xiàng),L(0)為選擇的第1項(xiàng),L(1)為選擇的第2項(xiàng)等等。L(0).SubItems(0).Text表示第1個(gè)選項(xiàng)的第一個(gè)子項(xiàng)的顯示內(nèi)容。屬性View:獲取或設(shè)置項(xiàng)在控件中的顯示方式,可以是Detail(詳細(xì)資料)、LargeIcon(大圖標(biāo))、List(列表)、SmallIcon(小圖標(biāo))。方法Clear:從控件中移除所有項(xiàng)的內(nèi)容。方法DragDropEffects DoDragDrop(object data,DragDropEffects allowEffects):開(kāi)始拖放操作,參數(shù)data是要傳送的數(shù)據(jù),可以是string、Bitmap、IDataObject、Metafile類的對(duì)象,或者是實(shí)現(xiàn)序列化的數(shù)據(jù)等。參數(shù)2確定哪些拖動(dòng)操作可以發(fā)生,可以是DragDropEffects.Copy、All、Link、Move、None、Scroll。事件ItemDrag:鼠標(biāo)開(kāi)始拖動(dòng)產(chǎn)生的事件。事件DragEnter:鼠標(biāo)進(jìn)入拖動(dòng)目的控件產(chǎn)生的事件。事件DragDrop:鼠標(biāo)進(jìn)入拖動(dòng)目的控件,并抬起鼠標(biāo)產(chǎn)生的事件。事件SelectedIndexChanged:當(dāng)列表視圖控件中選定的項(xiàng)的索引更改時(shí)發(fā)生。FolderBrowserDialog是選擇文件夾對(duì)話框,屬性SelectedPath是用戶選定的文件夾路徑,其余使用方法與打開(kāi)和保存文件對(duì)話框類似,這里就不多介紹了。9.4.2 在指定文件夾中查找文件【例9.19】Windows操作系統(tǒng)提供了一個(gè)查找文件的程序,可以查找指定文件夾中的指定文件,本例實(shí)現(xiàn)此功能。具體實(shí)現(xiàn)步驟如下:(1)新建項(xiàng)目。放置ListView控件到窗體,屬性View=Details,單擊屬性Column右側(cè)標(biāo)題為“”的按鈕,在彈出的“ColumnHeader集合編輯器”對(duì)話框(如下圖)中添加4個(gè)列頭,屬性Name分別為:FileName、FileDirectory、FileSize和LastWriteTime,屬性Text分別為:文件名稱、所在文件夾、大小和文件修改時(shí)間。(2)放置Label控件到窗體,屬性Text為指定搜索文件的名稱。在窗體中Label控件右側(cè)增加一個(gè)TextBox控件,屬性Text為空,用來(lái)輸入要搜索的文件名稱。(3)放置FolderBrowserDialog控件到窗體,Name=folderBrowserDialog1。(4)在窗體中增加2個(gè)Button控件,屬性Text分別為開(kāi)始搜索和停止搜索。(5)為窗體增加一個(gè)方法:FindFiles(DirectoryInfo dir,string FileName),該方法是在第一個(gè)參數(shù)指定的文件夾中查找第二個(gè)參數(shù)指定的所有文件。在一個(gè)文夾中可能還有子文件夾,子文件夾中可能還有子文件夾,因此要在第一個(gè)參數(shù)指定的文件夾中和其子文件夾中查找第二個(gè)參數(shù)指定的所有文件。為了實(shí)現(xiàn)能夠查找所有文件夾中的同名文件,采用遞歸調(diào)用方法,如果在一個(gè)文件夾中存在子文件夾,再一次調(diào)用函數(shù)自己,查找子文件夾中的文件。由于用到文件,在Form1.cs文件頭部增加語(yǔ)句:Imports System.IO 具體實(shí)現(xiàn)代碼如下:void FindFiles(DirectoryInfo dir,string FileName)FileInfo files=dir.GetFiles(FileName);if(files.Length!=0)foreach(FileInfo aFile in files)ListViewItem lvi;string s=new StringaFile.Name,aFile.Directory.FullName,aFile.Length.ToString(),aFile.LastWriteTime.ToString();lvi=new ListViewItem(s);listView1.Items.Add(lvi);DirectoryInfo dirs=dir.GetDirectories();if(dirs.Length!=0)foreach(DirectoryInfo aDir in dirs)FindFiles(aDir,FileName);/遞歸調(diào)用(6)為標(biāo)題為“開(kāi)始搜索”按鈕增加單擊事件函數(shù)如下:private void button1_Click(object sender,EventArgs e)string s=textBox1.Text;if(s=)MessageBox.Show(文件名稱名稱不能為空);else int n=s.IndexOf(.);/有無(wú)擴(kuò)展名 if(n=-1)/如無(wú)擴(kuò)展名,增加.*為擴(kuò)展名 s+=.*;if(folderBrowserDialog1.ShowDialog()=DialogResult.OK)DirectoryInfo dir=new DirectoryInfo (folderBrowserDialog1.SelectedPath.ToString();FindFiles(dir,s);(7)按以上設(shè)計(jì),無(wú)法在標(biāo)題為停止搜索按鈕的單擊事件處理函數(shù)中用代碼停止搜索,可行辦法是,查找文件在另一個(gè)線程中進(jìn)行,在單擊停止搜索按鈕后,停止搜索線程。(8)編譯運(yùn)行,查找D:gengUseDirectX目錄所有*.bmp文件的運(yùn)行效果如下圖。9.5 例子:鼠標(biāo)拖放打開(kāi)文件【例9.20】本例將圖像文件拖到PictureBox控件中,打開(kāi)并顯示圖像。進(jìn)行拖放操作的組件的AllowDrop屬性必須設(shè)定為True,因?yàn)榇藢傩允菦Q定組件是否可以進(jìn)行拖放操作。要完成拖放操作,必須處理好三個(gè)事件:ItemDrag、DragEnter、DragDrop。其中第一個(gè)事件是在源組件中觸發(fā)的,另外2個(gè)事件是在目標(biāo)組件中觸發(fā)的。當(dāng)用戶拖動(dòng)組件觸發(fā)ItemDrag事件;當(dāng)拖動(dòng)數(shù)據(jù)進(jìn)入目標(biāo)組件區(qū)域觸發(fā)DragEnter事件;當(dāng)用戶在目標(biāo)組件區(qū)域放置拖動(dòng)的數(shù)據(jù)觸發(fā)DragDrop事件。繼續(xù)上例,實(shí)現(xiàn)具體步驟如下:(9)設(shè)置ListView控件屬性MultiSelect=false,不允許多選。(10)放PictureBox控件到窗體。屬性Name=pictureBox1,在Form1類的Load事件函數(shù)最后增加語(yǔ)句:pictureBox1.AllowDrop=true;該屬性只能用此方法修改。(11)為L(zhǎng)istView的ItemDrag事件增加事件處理函數(shù)如下:private void listView1_ItemDrag(object sender,ItemDragEventArgs e)if(e.Button=MouseButtons.Right)return;int n=listView1.SelectedIndices.Count;if(n!=1)return;ListView.SelectedIndexCollection I=listView1.SelectedIndices;string s=listView1.ItemsI0.SubItems1.Text+;s+=listView1.ItemsI0.SubItems0.Text;if(s.Length=0)return;/下句將字符串s拷貝到目的地。也可用/DragDropEffects.Move,表示移動(dòng)。listView1.DoDragDrop(s,DragDropEffects.Copy);(12)為pictureBox1的事件DragEnter增加事件處理函數(shù)如下:private void pictureBox1_DragEnter(object sender,DragEventArgs e)if(e.Data.GetDataPresent(DataFormats.Text)e.Effect=DragDropEffects.Copy;elsee.Effect=DragDropEffects.None;(13)為pictureBox1的事件DragDrop增加事件處理函數(shù)如下:private void pictureBox1_DragDrop(object sender,DragEventArgs e)if(e.Data.GetDataPresent(typeof(System.String)&e.Effect=DragDropEffects.Copy)string s=(string)e.Data.GetData(typeof(System.String);Bitmap bits=new Bitmap(s);pictureBox1.Image=bits;(14)編譯、運(yùn)行,查找*.bmp文件,拖動(dòng)任一.bmp文件到pictureBox1中,看是否能打開(kāi)這個(gè)圖形文件顯示圖像。9.6 例子:拆分和合并文件【例9.21】在將一個(gè)文件作為電子郵件的附件傳送時(shí),由于附件的大小有限制,不能傳送太大的文件??梢詫⑤^大的文件分割為多個(gè)較小的文件,傳送后再合并為一個(gè)文件,下邊兩個(gè)方法實(shí)現(xiàn)文件的拆分和合并。首先是拆分方法,參數(shù)1是要拆分文件的路徑(路徑包括文件名及擴(kuò)展名),參數(shù)2是拆分后的文件名(無(wú)擴(kuò)展名),文件名后邊由拆分方法自動(dòng)增加序號(hào)和擴(kuò)展名,參數(shù)3是被拆分后的文件大小,單位為字節(jié)。拆分方法定義如下:void SplitFile(string f1,string f2,int f2Size)FileStream inFile=new FileStream (f1,FileMode.Open,FileAccess.Read);/只讀 bool mark=true;int n,i=0;byte buffer=new bytef2Size;FileStream OutFile=null;while(mark)if(n=inFile.Read(buffer,0,f2Size)0)OutFile=new FileStream(f2+i.ToString()+.fsm,FileMode.Create,FileAccess.Write);OutFile.Write(buffer,0,n);i+;OutFile.Close();else mark=false;inFile.Close();合并文件方法,參數(shù)1是要合并在一起的文件名(路徑包括文件名及擴(kuò)展名),參數(shù)2是拆分的文件名(無(wú)擴(kuò)展名,無(wú)序號(hào)),文件名后邊由合并方法自動(dòng)增加序號(hào)和擴(kuò)展名fsm,要將這些文件合并到參數(shù)1指定的文件,參數(shù)3是要合并的文件數(shù)。合并方法定義如下:void MergeFile(string f1,string f2,int f2Num)FileStream OutFile=new FileStream(f1,FileMode.Create,FileAccess.Write);long n,l;byte buffer;for(int i=0;if2Num;i+)FileStream InFile=new FileStream(f2+i.ToString()+.fsm,FileMode.Open,FileAccess.Read);l=InFile.Length;buffer=new bytel;n=InFile.Read(buffer,0,(int)l);OutFile.Write(buffer,0,(int)n);InFile.Close();OutFile.Close();下邊介紹兩個(gè)方法的使用。首先在D:/建立文件夾g,在文件夾g中建立一個(gè)小于20k的Word文檔g.doc。先調(diào)用方法SplitFile(d:/g/g.doc,d:/g/g,11000)拆分,然后調(diào)用方法MergeFile(d:/g/k.doc,d:/g/g,2)合并,看是否可以用Word程序打開(kāi)合并后的文檔。

注意事項(xiàng)

本文(C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流)為本站會(huì)員(yo****e)主動(dòng)上傳,裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng)(點(diǎn)擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因?yàn)榫W(wǎng)速或其他原因下載失敗請(qǐng)重新下載,重復(fù)下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!