C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流
《C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流》由會(huì)員分享,可在線閱讀,更多相關(guān)《C#應(yīng)用程序設(shè)計(jì)教程 第9章 文件和流(85頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、文件和流 本章介紹在C#語言中,如何處理目錄(文件夾),如何處理文件,如何使用流的概念讀寫文件。文件是用路徑來定位的,描述路徑有3種方式:絕對(duì)路徑、當(dāng)前工作盤的相對(duì)路徑、相對(duì)路徑。以C:dir1dir2為例(假定當(dāng)前工作目錄為C:dir1),C:dir1dir2為絕對(duì)路徑,dir1dir2為當(dāng)前工作盤的相對(duì)路徑,dir2為相對(duì)路徑,都表示C:dir1dir2。本章中所說的路徑,可以是路徑的3種描述方式中的任意一種。9.1 用流讀寫文件 .Net把讀寫的文件看成是順序字節(jié)流,用抽象類Stream代表一個(gè)流。Stream類有許多派生類,例如FileStream類,以字節(jié)為單位讀寫文件;Binary
2、Read類和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ì)象,用來打開和關(guān)閉文件,以字節(jié)為單位讀寫文件。構(gòu)造函數(shù):public New(string path,FileMode mode,FileAccess access)path:是文件的
3、相對(duì)路徑或絕對(duì)路徑。mode:為FileMode.Append,打開文件并將讀寫位置移到文件尾,文件不存在則創(chuàng)建新文件,只能同F(xiàn)ileAccess.Write一起使用。FileMode.Create,創(chuàng)建新文件,如果文件已存在,文件內(nèi)容將被刪除;FileMode.CreateNew,創(chuàng)建新文件,如果文件已存在,則引發(fā)異常;FileMode.Open,打開現(xiàn)有文件,如果文件不存在,則引發(fā)異常;FileMode.OpenOrCreate,如果文件存在,打開文件,否則,創(chuàng)建新文件;FileMode.Truncate,打開現(xiàn)有文件,并將文件所有內(nèi)容刪除。access:FileAccess.Read(只
4、讀方式打開文件)、FileAccess.Write(只寫方式打開文件)、FileAccess.ReadWrite(讀寫方式打開文件)。也可以沒有第三個(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ù)?!纠?.1】寫字節(jié)數(shù)組數(shù)據(jù)到文件的程序如下,該程序?qū)⒔⑽募:/g1.bin。注意,在文件頭部必須增加如下語句引入命名空間 Imports
5、 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)清除流
6、對(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.b
7、in,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ì)象長度,即文件的長度。只讀屬性。屬性Position:獲取或設(shè)置流對(duì)象當(dāng)前讀寫位置。方法long Seek(lon
8、g offset,SeekOrigin origin):該方法移動(dòng)文件讀寫位置到參數(shù)2指定位置加上參數(shù)1指定偏移量處,參數(shù)2可以是SeekOrigin.Begin、SeekOrigin.End、SeekOrigin.Current,分別為開始位置、結(jié)束位置、當(dāng)前讀寫位置?!纠纠?.3】使用方法Seek例子如下。using System;using System.IO;/使用文件必須引入的命名空間class FileStreamProperty static void Main()FileStream fs=new FileStream (“d:/g1.bin”,FileMode.Open);
9、/無第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ù)無第3個(gè)參數(shù),因此按讀寫方式打開。程序運(yùn)行結(jié)果如下:讀寫位置:6,能定位:true能讀:true,能寫:true9.1.2 BinaryReader、BinaryWriter類讀寫基本數(shù)據(jù)類型 使用BinaryReader和
10、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等。【例【例9.4】寫int類型數(shù)據(jù)程序如下:using System;using System.IO;/使用文件必須引入的命名空間class WriteFile static void Main()FileSt
11、ream 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ù)。方法沒有參數(shù)。方法byte ReadBytes(int count):返回字節(jié)數(shù)組保存從流讀出參數(shù)指定
12、的字節(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)容如
13、下:);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):
14、將字符串寫入流。方法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
15、(string path):參數(shù)是要讀文件的路徑。方法int Read():從流中讀取一個(gè)字符,并使讀字符位置移動(dòng)到下一個(gè)字符。返回代表讀出字符ASCII字符值的int類型整數(shù),如果沒有字符可以讀出,返回-1。如果sr是StreamReader對(duì)象,讀取一個(gè)字符的用法如下:char c=(char)sr.Read()。方法string ReadLine():從流中讀取一行字符并將數(shù)據(jù)作為字符串返回。行的定義是:兩個(gè)換行符(n或rn)之間的字符序列。返回的字符串不包含回車或換行符?!纠纠?.7】讀字符串程序如下,請(qǐng)先用上例建一個(gè)文件,然后用此例讀出。using System;using Sys
16、tem.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 i
17、n 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ù)組,用以上方法存入文件,就顯得過于復(fù)雜了。為了簡化這類問題,.net提出了序列化的概念,序列化包括序列化和反序列化,所謂序列化就是把類的對(duì)象作為一個(gè)整體存入文件,反序列化則是相反的過程。.net中的許多類都支持序列化,可以用如下方法判別一個(gè)類是否支持序列化:Dictionary h=new Dictionary();/建立泛型哈希表對(duì)象Type myType=h.GetType();/如為true,支持序列化,這里my
18、Bool=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(
19、“鍵2”,“值2”);/例如商品編號(hào)和商品名稱 /通過鍵值,可以很容易找到鍵值對(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
20、(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 S
21、ystem.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_a
22、ge=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=n
23、ew 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命名空
24、間)。其中MemoryStream類把文件放到內(nèi)存中,極大地提高了文件讀寫速度。BuffereStream類為文件讀寫建立一個(gè)緩沖區(qū),寫文件先把文件存到緩沖區(qū)中,緩沖區(qū)滿了以后,才寫入物理設(shè)備。先從文件讀入較多數(shù)據(jù)到緩沖區(qū),讀文件先從緩沖區(qū)讀,緩沖區(qū)沒有所需數(shù)據(jù),才再一次從物理設(shè)備讀數(shù)據(jù)到緩沖區(qū),用這樣的方法改善文件讀寫的性能。NetworkStream類把網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)也看作流。請(qǐng)用幫助系統(tǒng)查看這些類的用法。9.2 File類和FileInfo類 .Net通過File和FileInfo類來創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開文件。在File類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能,但Fi
25、le類不能建立對(duì)象。FileInfo類使用方法和File類基本相同,但FileInfo類能建立對(duì)象。在使用這兩個(gè)類時(shí)需要引用System.IO命名空間。這里重點(diǎn)介紹File類的使用方法。參見教科書的第193頁。以下使用例子介紹各個(gè)方法的用法。9.2.2 判斷文件是否存在 判斷文件是否存在的方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定的文件是否存在,參數(shù)path指定文件路徑。如果文件存在,返回true,如果文件不存在,或者訪問者不具有訪問此文件的權(quán)限,或者path描述一個(gè)目錄,返回false。下面的代碼段判斷是否存在c:Examp
26、lee1.txt文件:if(File.Exists(c:Examplee1.txt)/為處理代碼 9.2.3 刪除文件刪除文件方法:public static void Delete(string path);該方法刪除參數(shù)指定的文件,參數(shù)path指定要?jiǎng)h除的文件的路徑?!纠?.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(p
27、ath)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ù)制過去的文件所覆蓋?!纠?.11】文件復(fù)制例子如下:using System;using System.IO;class CopyFile
28、 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
29、.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可以
30、將一個(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
31、.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
32、(目錄文件)、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,如果未找到路徑
33、或文件,返回-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)Consol
34、e.WriteLine(隱藏文件);elseConsole.WriteLine(不是隱藏文件);FileInfo fileInfo=new FileInfo(path);Console.WriteLine(fileInfo.FullName+文件長度=+fileInfo.Length+,建立時(shí)間=+fileInfo.CreationTime);/也可用如下語句得到文件其他信息 Console.WriteLine(建立時(shí)間=+File.GetCreationTime(path)+最后修改時(shí)間=+File.GetLastWriteTime(path)+訪問時(shí)間=“+File.GetLastAcce
35、ssTime(path);else Console.WriteLine(文件不存在!);9.3 Directory類和DirectoryInfo類C#語言中通過Directory類來創(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類常用的方法
36、Directory類常用的方法如下,這些方法都是靜態(tài)方法。后面將通過程序?qū)嵗齺斫榻B其中主要方法的使用。方法定義使用說明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ù)指定的文件夾中所有子文件夾名稱
37、。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指定文件或文件夾及
38、包含的文件、子文件夾移動(dòng)到新位置。見9.3.5節(jié)。void SetCurrentDirectory(string s)將參數(shù)指定目錄設(shè)置為應(yīng)用程序當(dāng)前工作目錄。GetCreationTime()、GetLastWriteTime()、GetLastAccessTime()、SetCreationTime()、SetLastAccessTime和SetLastWriteTime 見9.2.1節(jié)同名函數(shù)。9.3.2 判斷目錄是否存在方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定目錄是否存在,參數(shù)path指定目錄的路徑。如果目錄存在,返
39、回true,如果目錄不存在,或者訪問者不具有訪問此目錄權(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 Syste
40、m.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è)參
41、數(shù)為bool類型,為true可以刪除非空目錄;若為false,則僅當(dāng)目錄為空時(shí)才可刪除。【例9.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
42、 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
43、.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(p
44、ath,path1);/如2個(gè)目錄在 /同一磁盤,可用被注解語句替換前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()
45、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.
46、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);for
47、each(string aFile in files)Console.WriteLine(aFile);elseConsole.WriteLine(目錄不存在!);9.3.8 設(shè)置目錄屬性與文件屬性相同,目錄屬性也是使用FileAttributes來進(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è)查找指定路徑中指
48、定文件的程序。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=
49、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表
50、示第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):開始拖放操作,參數(shù)data是要傳送的數(shù)據(jù),可以是string、Bitmap、IDataObject、Metafile類的對(duì)象,或者是實(shí)現(xiàn)序列化的數(shù)據(jù)等。參數(shù)2確定哪些拖動(dòng)操作可以發(fā)生,可以是DragDropEffects.C
51、opy、All、Link、Move、None、Scroll。事件ItemDrag:鼠標(biāo)開始拖動(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是用戶選定的文件夾路徑,其余使用方法與打開和保存文件對(duì)話框類似,這里就不多介紹了。9.4.2 在指定文件夾中查找文件【例9.19】Windows操作系統(tǒng)提供了一個(gè)查找文件的程序,可以查找指定文件夾中
52、的指定文件,本例實(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為空,用來輸入要搜索的文件名稱。(3)放置Fold
53、erBrowserDialog控件到窗體,Name=folderBrowserDialog1。(4)在窗體中增加2個(gè)Button控件,屬性Text分別為開始搜索和停止搜索。(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ù)自己,查找
54、子文件夾中的文件。由于用到文件,在Form1.cs文件頭部增加語句: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
55、.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)題為“開始搜索”按鈕增加單擊事件函數(shù)如下:private void button1_Click(object sender,EventArgs e)string s=textBox1.Text;
56、if(s=)MessageBox.Show(文件名稱名稱不能為空);else int n=s.IndexOf(.);/有無擴(kuò)展名 if(n=-1)/如無擴(kuò)展名,增加.*為擴(kuò)展名 s+=.*;if(folderBrowserDialog1.ShowDialog()=DialogResult.OK)DirectoryInfo dir=new DirectoryInfo (folderBrowserDialog1.SelectedPath.ToString();FindFiles(dir,s);(7)按以上設(shè)計(jì),無法在標(biāo)題為停止搜索按鈕的單擊事件處理函數(shù)中用代碼停止搜索,可行辦法是,查找文件在另一個(gè)
57、線程中進(jìn)行,在單擊停止搜索按鈕后,停止搜索線程。(8)編譯運(yùn)行,查找D:gengUseDirectX目錄所有*.bmp文件的運(yùn)行效果如下圖。9.5 例子:鼠標(biāo)拖放打開文件【例9.20】本例將圖像文件拖到PictureBox控件中,打開并顯示圖像。進(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事
58、件;當(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ù)最后增加語句:pictureBox1.AllowDrop=true;該屬性只能用此方法修改。(11)為ListView的ItemDrag事件增加事件處理函數(shù)如下:private void listView1_ItemDrag(object sender,ItemDragEventArgs e)if(e.Butto
59、n=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.DoD
60、ragDrop(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 picture
61、Box1_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中,看是否能打開這個(gè)圖形文件顯示圖像。9.6 例子:拆分和合并文件【
62、例9.21】在將一個(gè)文件作為電子郵件的附件傳送時(shí),由于附件的大小有限制,不能傳送太大的文件??梢詫⑤^大的文件分割為多個(gè)較小的文件,傳送后再合并為一個(gè)文件,下邊兩個(gè)方法實(shí)現(xiàn)文件的拆分和合并。首先是拆分方法,參數(shù)1是要拆分文件的路徑(路徑包括文件名及擴(kuò)展名),參數(shù)2是拆分后的文件名(無擴(kuò)展名),文件名后邊由拆分方法自動(dòng)增加序號(hào)和擴(kuò)展名,參數(shù)3是被拆分后的文件大小,單位為字節(jié)。拆分方法定義如下:void SplitFile(string f1,string f2,int f2Size)FileStream inFile=new FileStream (f1,FileMode.Open,FileAcc
63、ess.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
64、是要合并在一起的文件名(路徑包括文件名及擴(kuò)展名),參數(shù)2是拆分的文件名(無擴(kuò)展名,無序號(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
65、(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程序打開合并后的文檔。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025《增值稅法》高質(zhì)量發(fā)展的增值稅制度規(guī)范增值稅的征收和繳納
- 深入學(xué)習(xí)《中華人民共和國科學(xué)技術(shù)普及法》推進(jìn)實(shí)現(xiàn)高水平科技自立自強(qiáng)推動(dòng)經(jīng)濟(jì)發(fā)展和社會(huì)進(jìn)步
- 激揚(yáng)正氣淬煉本色踐行使命廉潔從政黨課
- 加強(qiáng)廉潔文化建設(shè)夯實(shí)廉政思想根基培育風(fēng)清氣正的政治生態(tài)
- 深入學(xué)習(xí)2024《突發(fā)事件應(yīng)對(duì)法》全文提高突發(fā)事件預(yù)防和應(yīng)對(duì)能力規(guī)范突發(fā)事件應(yīng)對(duì)活動(dòng)保護(hù)人民生命財(cái)產(chǎn)安全
- 2023年四年級(jí)數(shù)學(xué)上冊(cè)第一輪單元滾動(dòng)復(fù)習(xí)第10天平行四邊形和梯形作業(yè)課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊(cè)第14單元階段性綜合復(fù)習(xí)作業(yè)課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊(cè)易錯(cuò)清單十五課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊(cè)易錯(cuò)清單七課件西師大版
- 2023年五年級(jí)數(shù)學(xué)下冊(cè)易錯(cuò)清單六作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊(cè)易錯(cuò)清單二作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊(cè)四分?jǐn)?shù)的意義和性質(zhì)第10課時(shí)異分母分?jǐn)?shù)的大小比較作業(yè)課件蘇教版
- 2023年五年級(jí)數(shù)學(xué)下冊(cè)周周練四作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊(cè)六折線統(tǒng)計(jì)圖單元復(fù)習(xí)卡作業(yè)課件西師大版
- 2023年四年級(jí)數(shù)學(xué)上冊(cè)6除數(shù)是兩位數(shù)的除法單元易錯(cuò)集錦一作業(yè)課件新人教版