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

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

  • 資源ID:119792178       資源大?。?span id="3lg3pnk" class="font-tahoma">330KB        全文頁數(shù):85頁
  • 資源格式: PPT        下載積分:16積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要16積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

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

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

文件和流 本章介紹在C#語言中,如何處理目錄(文件夾),如何處理文件,如何使用流的概念讀寫文件。文件是用路徑來定位的,描述路徑有3種方式:絕對路徑、當前工作盤的相對路徑、相對路徑。以C:dir1dir2為例(假定當前工作目錄為C:dir1),C:dir1dir2為絕對路徑,dir1dir2為當前工作盤的相對路徑,dir2為相對路徑,都表示C:dir1dir2。本章中所說的路徑,可以是路徑的3種描述方式中的任意一種。9.1 用流讀寫文件 .Net把讀寫的文件看成是順序字節(jié)流,用抽象類Stream代表一個流。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類可以建立文件流對象,用來打開和關(guān)閉文件,以字節(jié)為單位讀寫文件。構(gòu)造函數(shù):public New(string path,FileMode mode,FileAccess access)path:是文件的相對路徑或絕對路徑。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(只讀方式打開文件)、FileAccess.Write(只寫方式打開文件)、FileAccess.ReadWrite(讀寫方式打開文件)。也可以沒有第三個參數(shù),默認為FileAccess.ReadWrite。共有8個構(gòu)造函數(shù),其他構(gòu)造函數(shù)請用VS2005幫助系統(tǒng)查看。方法void Write(byte array,int offset,int count):將參數(shù)1指定數(shù)組中多個字節(jié)寫入流,要寫入流的第1個字節(jié)是arrayoffset,參數(shù)3為要寫入的字節(jié)數(shù)?!纠?.1】寫字節(jié)數(shù)組數(shù)據(jù)到文件的程序如下,該程序?qū)⒔⑽募:/g1.bin。注意,在文件頭部必須增加如下語句引入命名空間 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);/建立流對象 /寫data字節(jié)數(shù)組中的所有數(shù)據(jù)到文件 fs.Write(data,0,10);fs.Close()/不再使用的流對象,必須關(guān)閉。/垃圾收集器不能自動清除流對象 方法int Read(byte array,int offset,int count):從流中讀數(shù)據(jù)寫入字節(jié)數(shù)組array,讀入的第1個字節(jié)寫入arrayoffset,參數(shù)3為要讀入的字節(jié)數(shù)。返回值為所讀字節(jié)數(shù),由于可能已讀到文件尾部,其值可能小于count,甚至為0?!纠?.2】讀一個文件所有字節(jié)到數(shù)組并在屏幕顯示的程序如下,請先用上例建一個文件,然后用此例讀出。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:檢查流對象是否可以讀、定位、寫。只讀屬性。屬性Length:以字節(jié)為單位表示流對象長度,即文件的長度。只讀屬性。屬性Position:獲取或設(shè)置流對象當前讀寫位置。方法long Seek(long offset,SeekOrigin origin):該方法移動文件讀寫位置到參數(shù)2指定位置加上參數(shù)1指定偏移量處,參數(shù)2可以是SeekOrigin.Begin、SeekOrigin.End、SeekOrigin.Current,分別為開始位置、結(jié)束位置、當前讀寫位置。【例【例9.3】使用方法Seek例子如下。using System;using System.IO;/使用文件必須引入的命名空間class FileStreamProperty static void Main()FileStream fs=new FileStream (“d:/g1.bin”,FileMode.Open);/無第3個參數(shù) /文件讀寫位置移到從文件尾部向前4個字節(jié) fs.Seek(-4,SeekOrigin.End);Console.WriteLine(讀寫位置:0,能定位:1,fs.Position,fs.CanSeek);Console.WriteLine(能讀:0,能寫:1,fs.CanRead,fs.CanWrite);fs.Close();注意建立流對象fs的構(gòu)造函數(shù)無第3個參數(shù),因此按讀寫方式打開。程序運行結(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類對象。方法viod Write(數(shù)據(jù)類型 Value):寫入?yún)?shù)指定的數(shù)據(jù)類型的一個數(shù)據(jù),數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,例如,int、bool、float等。【例【例9.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類對象。方法ReadBoolean、ReadByte、ReadChar:返回一個指定類型數(shù)據(jù)。方法沒有參數(shù)。方法byte ReadBytes(int count):返回字節(jié)數(shù)組保存從流讀出參數(shù)指定的字節(jié)?!纠?.5】讀int類型數(shù)據(jù)程序如下,先用上例建一個文件,然后用此例讀出。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個);w.Write(“End of file”);/一個字符串為文件中的一行 w.Close();常用StreamReader類方法如下:構(gòu)造函數(shù)StreamReader(string path):參數(shù)是要讀文件的路徑。方法int Read():從流中讀取一個字符,并使讀字符位置移動到下一個字符。返回代表讀出字符ASCII字符值的int類型整數(shù),如果沒有字符可以讀出,返回-1。如果sr是StreamReader對象,讀取一個字符的用法如下:char c=(char)sr.Read()。方法string ReadLine():從流中讀取一行字符并將數(shù)據(jù)作為字符串返回。行的定義是:兩個換行符(n或rn)之間的字符序列。返回的字符串不包含回車或換行符?!纠纠?.7】讀字符串程序如下,請先用上例建一個文件,然后用此例讀出。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);程序運行結(jié)果如下:文件的內(nèi)容如下:100100個End of file9.1.4 序列化 對于一個復雜的數(shù)據(jù)結(jié)構(gòu),例如數(shù)組,用以上方法存入文件,就顯得過于復雜了。為了簡化這類問題,.net提出了序列化的概念,序列化包括序列化和反序列化,所謂序列化就是把類的對象作為一個整體存入文件,反序列化則是相反的過程。.net中的許多類都支持序列化,可以用如下方法判別一個類是否支持序列化:Dictionary h=new Dictionary();/建立泛型哈希表對象Type myType=h.GetType();/如為true,支持序列化,這里myBool=truebool myBool=myType.IsSerializable;【例【例9.8】下邊的例子完成了一個哈希表對象的序列化。using System.Collections.Generic;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.Serialization;class SerialFile static void Main()Dictionary h=new Dictionary();/建立哈希表對象 h.Add(鍵1,值1);/哈希表每一個元素是一對鍵值 h.Add(“鍵2”,“值2”);/例如商品編號和商品名稱 /通過鍵值,可以很容易找到鍵值對應(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);/注意哈希表用法 運行結(jié)果如下:鍵1:值1;鍵2:值2;鍵3:值3;【例【例9.9】自己定義的類也可以序列化,只要在類定義前增加Serializable即可,下邊例子首先定義了一個可序列化的類Person,建立若干Person類對象,存到List類對象中,并將List類對象序列化。程序如下: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);運行結(jié)果如下:Name=張三,Age=12;Name=李四,Age=24;9.1.5 Stream類的其他派生類Stream類的其他派生類包括:MemoryStream、BuffereStream、NetworkStream(在System.Net.Sockets命名空間)。其中MemoryStream類把文件放到內(nèi)存中,極大地提高了文件讀寫速度。BuffereStream類為文件讀寫建立一個緩沖區(qū),寫文件先把文件存到緩沖區(qū)中,緩沖區(qū)滿了以后,才寫入物理設(shè)備。先從文件讀入較多數(shù)據(jù)到緩沖區(qū),讀文件先從緩沖區(qū)讀,緩沖區(qū)沒有所需數(shù)據(jù),才再一次從物理設(shè)備讀數(shù)據(jù)到緩沖區(qū),用這樣的方法改善文件讀寫的性能。NetworkStream類把網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)也看作流。請用幫助系統(tǒng)查看這些類的用法。9.2 File類和FileInfo類 .Net通過File和FileInfo類來創(chuàng)建、復制、刪除、移動和打開文件。在File類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能,但File類不能建立對象。FileInfo類使用方法和File類基本相同,但FileInfo類能建立對象。在使用這兩個類時需要引用System.IO命名空間。這里重點介紹File類的使用方法。參見教科書的第193頁。以下使用例子介紹各個方法的用法。9.2.2 判斷文件是否存在 判斷文件是否存在的方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定的文件是否存在,參數(shù)path指定文件路徑。如果文件存在,返回true,如果文件不存在,或者訪問者不具有訪問此文件的權(quán)限,或者path描述一個目錄,返回false。下面的代碼段判斷是否存在c:Examplee1.txt文件:if(File.Exists(c:Examplee1.txt)/為處理代碼 9.2.3 刪除文件刪除文件方法:public static void Delete(string path);該方法刪除參數(shù)指定的文件,參數(shù)path指定要刪除的文件的路徑?!纠?.10】下面的程序刪除用戶指定文件。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請鍵入要刪除文件的路徑:);string path=Console.ReadLine();if(File.Exists(path)File.Delete(path);elseConsole.WriteLine(文件不存在!);9.2.4 復制文件復制文件方法:public static void Copy(string sFName,string dFName,bool overW);該方法將參數(shù)sFName指定文件拷貝到參數(shù)destFileName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果OverW為true,而且文件名為dFName的文件已存在的話,將會被復制過去的文件所覆蓋?!纠?.11】文件復制例子如下:using System;using System.IO;class CopyFile static void Main()Console.WriteLine (請鍵入要拷貝的源文件的路徑:);string path=Console.ReadLine();Console.WriteLine (請鍵入要拷貝的目文件的路徑(包括文件名):);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 移動文件 移動文件方法:public static void Move(string sFName,string dFName);該方法將參數(shù)sFName指定文件移動到參數(shù)dFName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果目標文件已經(jīng)存在,或者路徑格式不對,將引發(fā)異常。注意,只能在同一個邏輯盤下進行文件轉(zhuǎn)移。如果試圖將c盤下的文件轉(zhuǎn)移到d盤,將發(fā)生錯誤。下面的代碼可以將c:Example下的e1.txt文件移動到c盤根目錄下。File.Move(c:ExampleBackUp.txt,c:BackUp.txt);【例9.12】FileInfo類方法MoveTo可以將一個邏輯盤的文件移到另一個邏輯盤,例子如下:using System;using System.IO;class MoveFile static void Main()Console.WriteLine (請鍵入要移動的源文件的路徑:);string path=Console.ReadLine();Console.WriteLine (請鍵入要移動的目文件的路徑(包括文件名):);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è)置文件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+文件長度=+fileInfo.Length+,建立時間=+fileInfo.CreationTime);/也可用如下語句得到文件其他信息 Console.WriteLine(建立時間=+File.GetCreationTime(path)+最后修改時間=+File.GetLastWriteTime(path)+訪問時間=“+File.GetLastAccessTime(path);else Console.WriteLine(文件不存在!);9.3 Directory類和DirectoryInfo類C#語言中通過Directory類來創(chuàng)建、復制、刪除、移動文件夾。在Directory類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能。Directory類不能建立對象。DirectoryInfo類使用方法和Directory類基本相同,但DirectoryInfo類能建立對象。在使用這兩個類時需要引用System.IO命名空間。這里重點介紹Directory類的使用方法。以下使用例子介紹各個方法的用法。9.3.1 Directory類常用的方法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)用程序的當前工作目錄。string GetDirectories(string s)返回字符串數(shù)組,記錄參數(shù)指定的文件夾中所有子文件夾名稱。string GetDirectoryRoot(string s)返回參數(shù)指定路徑的卷信息、根信息的字符串。string GetFiles(string s)返回字符串數(shù)組,記錄指定文件夾中所有文件名稱。string GetFileSystemEntries(string s)返回指定目錄中所有文件和子目錄名稱。string GetLogicalDrives()返回字符串數(shù)組記錄計算機所有驅(qū)動器名稱,如A:、C:。DirectoryInfo GetParent(string s)返回參數(shù)指定路徑的父文件夾。void Move(String s1,String s2)將參數(shù)1指定文件或文件夾及包含的文件、子文件夾移動到新位置。見9.3.5節(jié)。void SetCurrentDirectory(string s)將參數(shù)指定目錄設(shè)置為應(yīng)用程序當前工作目錄。GetCreationTime()、GetLastWriteTime()、GetLastAccessTime()、SetCreationTime()、SetLastAccessTime和SetLastWriteTime 見9.2.1節(jié)同名函數(shù)。9.3.2 判斷目錄是否存在方法聲明如下:public static bool Exists(string path);該方法判斷參數(shù)指定目錄是否存在,參數(shù)path指定目錄的路徑。如果目錄存在,返回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ā)異常。【例9.14】下面的程序創(chuàng)建按用戶輸入的目錄名創(chuàng)建目錄,具體程序如下:using System;using System.IO;class CreateFileDirectory static void Main()Console.WriteLine(請鍵入要創(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指定的目錄。方法的第二個參數(shù)為bool類型,為true可以刪除非空目錄;若為false,則僅當目錄為空時才可刪除。【例9.15】下面的程序刪除用戶指定目錄。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請鍵入要刪除目錄的路徑:);string path=Console.ReadLine();if(Directory.Exists(path)Directory.Delete(path);else Console.WriteLine(目錄不存在或目錄非法!);9.3.5 移動目錄 移動目錄方法:public static void Move(string sourceDirName,string destDirName);該方法將文件或目錄及其子目錄移到新位置,如果目標目錄已經(jīng)存在,或者路徑格式不對,將引發(fā)異常。注意,只能在同一個邏輯盤下進行目錄轉(zhuǎn)移。如果試圖將c盤下的目錄轉(zhuǎn)移到d盤,將發(fā)生錯誤。下面的代碼可以將目錄c:Dir1Dir2移動到c:Dir3Dir4。Directory.Move(c:Dir1Dir2,c:Dir3Dir4);【例9.16】Directory Info類方法MoveTo可以將一個邏輯盤的目錄移到另一個邏輯盤,例子如下:using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請鍵入要移動源目錄的路徑:);string path=Console.ReadLine();Console.WriteLine (請鍵入要移動的目的目錄的路徑:);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個目錄在 /同一磁盤,可用被注解語句替換前2句 elseConsole.WriteLine(目的目錄已存在!);elseConsole.WriteLine(源目錄不存在!);9.3.6 獲取當前目錄下所有子目錄該 方 法 聲 明 如 下: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(請鍵入目錄的路徑:);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 獲取當前目錄下的所有文件該方法聲明如下:public static string GetFiles(string path);【例9.18】下面的程序讀出用戶指定目錄下的所有文件名,并將文件在屏幕上顯示。using System;using System.IO;class DeleteFile static void Main()Console.WriteLine(請鍵入目錄的路徑:);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來進行設(shè)置的。下面的代碼設(shè)置c:Dir1Dir2目錄為只讀、隱藏。DirectoryInfo DirInfo=new DirectoryInfo(c:Dir1Dir2);DirInfo.Atttributes=FileAttributes.ReadOnly|FileAttributes.Hidden;9.4 例子:查找文件本節(jié)實現(xiàn)一個查找指定路徑中指定文件的程序。9.4.1 ListView和FolderBrowserDialogListView控件可用4種不同視圖(詳細資料、大圖標、列表、小圖標)中的一種顯示一些項的集合,ListView控件的外觀與Windows 資源管理器的文件列表外觀相似。其常用屬性、方法和事件如下:屬性Columns:所有列標頭的集合,可用“ColumnHeader集合編輯器”對話框修改。屬性MultiSelect:獲取或設(shè)置一個值,該值指示是否可以選擇多個項。屬性SelectedIndices:獲取控件中選定項的索引集合。用下式得到這個集合:ListView.SelectedIndexCollection I=ListView1.SelectedIndices;I.Length為選擇了多少項,I(0)為選擇的第1項的索引,I(1)為選擇的第2項的索引等。ListView1.Items(I(0).SubItems(0).Text表示第1個選項的第一個子項的顯示內(nèi)容。屬性SelectedItems:獲取控件中選定項的集合。用下式得到這個集合:ListView.SelectedListViewItemCollection L=ListView1.SelectedItems;其中L.Length表示選擇了多少項,L(0)為選擇的第1項,L(1)為選擇的第2項等等。L(0).SubItems(0).Text表示第1個選項的第一個子項的顯示內(nèi)容。屬性View:獲取或設(shè)置項在控件中的顯示方式,可以是Detail(詳細資料)、LargeIcon(大圖標)、List(列表)、SmallIcon(小圖標)。方法Clear:從控件中移除所有項的內(nèi)容。方法DragDropEffects DoDragDrop(object data,DragDropEffects allowEffects):開始拖放操作,參數(shù)data是要傳送的數(shù)據(jù),可以是string、Bitmap、IDataObject、Metafile類的對象,或者是實現(xiàn)序列化的數(shù)據(jù)等。參數(shù)2確定哪些拖動操作可以發(fā)生,可以是DragDropEffects.Copy、All、Link、Move、None、Scroll。事件ItemDrag:鼠標開始拖動產(chǎn)生的事件。事件DragEnter:鼠標進入拖動目的控件產(chǎn)生的事件。事件DragDrop:鼠標進入拖動目的控件,并抬起鼠標產(chǎn)生的事件。事件SelectedIndexChanged:當列表視圖控件中選定的項的索引更改時發(fā)生。FolderBrowserDialog是選擇文件夾對話框,屬性SelectedPath是用戶選定的文件夾路徑,其余使用方法與打開和保存文件對話框類似,這里就不多介紹了。9.4.2 在指定文件夾中查找文件【例9.19】Windows操作系統(tǒng)提供了一個查找文件的程序,可以查找指定文件夾中的指定文件,本例實現(xiàn)此功能。具體實現(xiàn)步驟如下:(1)新建項目。放置ListView控件到窗體,屬性View=Details,單擊屬性Column右側(cè)標題為“”的按鈕,在彈出的“ColumnHeader集合編輯器”對話框(如下圖)中添加4個列頭,屬性Name分別為:FileName、FileDirectory、FileSize和LastWriteTime,屬性Text分別為:文件名稱、所在文件夾、大小和文件修改時間。(2)放置Label控件到窗體,屬性Text為指定搜索文件的名稱。在窗體中Label控件右側(cè)增加一個TextBox控件,屬性Text為空,用來輸入要搜索的文件名稱。(3)放置FolderBrowserDialog控件到窗體,Name=folderBrowserDialog1。(4)在窗體中增加2個Button控件,屬性Text分別為開始搜索和停止搜索。(5)為窗體增加一個方法:FindFiles(DirectoryInfo dir,string FileName),該方法是在第一個參數(shù)指定的文件夾中查找第二個參數(shù)指定的所有文件。在一個文夾中可能還有子文件夾,子文件夾中可能還有子文件夾,因此要在第一個參數(shù)指定的文件夾中和其子文件夾中查找第二個參數(shù)指定的所有文件。為了實現(xiàn)能夠查找所有文件夾中的同名文件,采用遞歸調(diào)用方法,如果在一個文件夾中存在子文件夾,再一次調(diào)用函數(shù)自己,查找子文件夾中的文件。由于用到文件,在Form1.cs文件頭部增加語句:Imports System.IO 具體實現(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)為標題為“開始搜索”按鈕增加單擊事件函數(shù)如下:private void button1_Click(object sender,EventArgs e)string s=textBox1.Text;if(s=)MessageBox.Show(文件名稱名稱不能為空);else int n=s.IndexOf(.);/有無擴展名 if(n=-1)/如無擴展名,增加.*為擴展名 s+=.*;if(folderBrowserDialog1.ShowDialog()=DialogResult.OK)DirectoryInfo dir=new DirectoryInfo (folderBrowserDialog1.SelectedPath.ToString();FindFiles(dir,s);(7)按以上設(shè)計,無法在標題為停止搜索按鈕的單擊事件處理函數(shù)中用代碼停止搜索,可行辦法是,查找文件在另一個線程中進行,在單擊停止搜索按鈕后,停止搜索線程。(8)編譯運行,查找D:gengUseDirectX目錄所有*.bmp文件的運行效果如下圖。9.5 例子:鼠標拖放打開文件【例9.20】本例將圖像文件拖到PictureBox控件中,打開并顯示圖像。進行拖放操作的組件的AllowDrop屬性必須設(shè)定為True,因為此屬性是決定組件是否可以進行拖放操作。要完成拖放操作,必須處理好三個事件:ItemDrag、DragEnter、DragDrop。其中第一個事件是在源組件中觸發(fā)的,另外2個事件是在目標組件中觸發(fā)的。當用戶拖動組件觸發(fā)ItemDrag事件;當拖動數(shù)據(jù)進入目標組件區(qū)域觸發(fā)DragEnter事件;當用戶在目標組件區(qū)域放置拖動的數(shù)據(jù)觸發(fā)DragDrop事件。繼續(xù)上例,實現(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.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,表示移動。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)編譯、運行,查找*.bmp文件,拖動任一.bmp文件到pictureBox1中,看是否能打開這個圖形文件顯示圖像。9.6 例子:拆分和合并文件【例9.21】在將一個文件作為電子郵件的附件傳送時,由于附件的大小有限制,不能傳送太大的文件??梢詫⑤^大的文件分割為多個較小的文件,傳送后再合并為一個文件,下邊兩個方法實現(xiàn)文件的拆分和合并。首先是拆分方法,參數(shù)1是要拆分文件的路徑(路徑包括文件名及擴展名),參數(shù)2是拆分后的文件名(無擴展名),文件名后邊由拆分方法自動增加序號和擴展名,參數(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是要合并在一起的文件名(路徑包括文件名及擴展名),參數(shù)2是拆分的文件名(無擴展名,無序號),文件名后邊由合并方法自動增加序號和擴展名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();下邊介紹兩個方法的使用。首先在D:/建立文件夾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程序打開合并后的文檔。

注意事項

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

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




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

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

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


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