第4章 文件和流_第1頁
第4章 文件和流_第2頁
第4章 文件和流_第3頁
第4章 文件和流_第4頁
第4章 文件和流_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章文件和流學習目的C#語言采用了流的概念讀寫文件。本章介紹在C#語言中,能夠處理目錄(文件夾),能夠處理文件,能夠使用流的概念讀寫文件。文件是用路徑來定位的,描述路徑有3種方式:絕對路徑、當前工作盤的相對路徑、相對路徑。主要內容4.1用流讀寫文件4.2File類和FileInfo類4.3Directory類和DirectoryInfo類4.4例子:在指定文件夾中查找文件4.5例子:鼠標拖放打開文件4.6例子:拆分和合并文件

4.1用流讀寫文件C#把讀寫的文件看作是順序字節(jié)流,用抽象類Stream代表流。Stream類有許多派生類,如FileStream類,以字節(jié)為單位讀寫文件;BinaryRead類和BinaryWrite類,以基本數(shù)據(jù)類型為單位讀寫文件,可以從文件直接讀寫bool、String、int16、int等基本數(shù)據(jù)類型數(shù)據(jù);StreamReader和StreamWriter類以字符或字符串為單位讀寫文件。使用流讀寫文件必須引入命名空間:System.IO。4.1.1FileStream類讀寫字節(jié)使用FileStream類可以建立文件流對象,用來打開和關閉文件,以字節(jié)為單位讀寫文件。也可對與文件相關的操作系統(tǒng)句柄進行操作,如管道、標準輸入和標準輸出。FileStream類對象能對輸入輸出進行緩沖,從而提高性能。該類常用屬性、方法如下:屬性CanRead、CanSeek、CanWrite:檢查流對象是否可以讀、定位、寫。屬性Length:以字節(jié)為單位表示流對象長度,即文件的長度。屬性Position:獲取或設置流對象當前讀寫位置。構造函數(shù)publicFileStream(string

path,FileMode

mode,FileAccessaccess):參數(shù)path是文件的相對路徑或絕對路徑,構造函數(shù)將建立參數(shù)path指定文件的FileStream類對象。共有8個構造函數(shù)。方法voidWrite(byte[]array,int

offset,intcount):將參數(shù)1指定數(shù)組中多個字節(jié)寫入流,要寫入流的第1個字節(jié)是array[offset],參數(shù)3為要寫入的字節(jié)數(shù)。【例4.1】寫字節(jié)數(shù)組數(shù)據(jù)到文件的程序如下,該程序將建立文件d:/g1.bin。usingSystem;usingSystem.IO;classProgram{ staticvoidMain(string[]args){byte[]data=newbyte[10];

for(inti=0;i<10;i++)

data[i]=(byte)i;

FileStream

fs=newFileStream("d://g1.bin",FileMode.Create);fs.Write(data,0,10);

fs.Close();}}方法int

Read(byte[]array,int

offset,intcount):從流中讀數(shù)據(jù)寫入字節(jié)數(shù)組array,讀入的第1個字節(jié)寫入array[offset],參數(shù)3為要讀入的字節(jié)數(shù)。返回值為所讀字節(jié)數(shù),由于可能已讀到文件尾部,其值可能小于count,甚至為0?!纠?.2】讀一個文件所有字節(jié)到數(shù)組并在屏幕顯示的程序如下,請先用上例建一個文件,然后用此例讀出。usingSystem.IO;classProgram{ staticvoidMain(){FileStream

fs=newFileStream("d://g1.bin",FileMode.Open);byte[]data=newbyte[fs.Length];longn=fs.Read(data,0,(int)fs.Length);

fs.Close();

Console.WriteLine("文件的內容如下:");

foreach(bytemindata)Console.Write("{0},",m);}}方法longSeek(long

offset,SeekOriginorigin):該方法移動文件讀寫位置到參數(shù)2指定位置加上參數(shù)1指定偏移量處,參數(shù)2可以是SeekOrigin.Begin、SeekOrigin.End、SeekOrigin.Current,分別為開始位置、結束位置、當前讀寫位置?!纠?.3】使用方法Seek例子如下。usingSystem;usingSystem.IO;classProgram{ staticvoidMain(){ FileStream

fs=newFileStream("d://g1.bin",FileMode.Open);fs.Seek(-4,SeekOrigin.End);

Console.WriteLine("讀寫位置:{0},能定位:{1}",fs.Position,fs.CanSeek);

Console.WriteLine("能讀:{0},能寫:{1}",fs.CanRead,fs.CanWrite);

fs.Close();}注意建立流對象fs的構造函數(shù)無第3個參數(shù),因此按讀寫方式打開。程序運行結果如下:讀寫位置:6,能定位:true能讀:true,能寫:true4.1.2BinaryReader、BinaryWriter類讀寫基本數(shù)據(jù)類型

使用BinaryReader和BinaryWriter類可以從文件直接讀寫bool、String、int16、int等基本數(shù)據(jù)類型數(shù)據(jù)。常用BinaryWriter類方法如下:構造函數(shù)BinaryWriter(Streaminput):參數(shù)為FileStream類對象。方法viodWrite(數(shù)據(jù)類型Value):寫入?yún)?shù)指定的數(shù)據(jù)類型的一個數(shù)據(jù),數(shù)據(jù)類型可以是基本數(shù)據(jù)類型,例如,int、bool、float等?!纠?.4】寫int類型數(shù)據(jù)程序如下:classProgram{ staticvoidMain(){FileStream

fs=newFileStream("d://g1.dat",FileMode.Create);

BinaryWriterw=newBinaryWriter(fs);

for(inti=0;i<10;i++)

w.Write(i);

w.Close();}}常用BinaryReader類方法如下:構造函數(shù)BinaryReader(Streaminput):參數(shù)為FileStream類對象。方法ReadBoolean、ReadByte、ReadChar:返回一個指定類型數(shù)據(jù)。方法沒有參數(shù)。方法byte[]ReadBytes(intcount):返回字節(jié)數(shù)組保存從流讀出參數(shù)指定的字節(jié)?!纠?.5】讀int類型數(shù)據(jù)程序如下,用上例建一個文件,用此例讀出。classProgram{ staticvoidMain(){int[]data=newint[10];

FileStream

fs=newFileStream("d://g1.dat",FileMode.Open);

BinaryReaderr=newBinaryReader(fs);

for(inti=0;i<10;i++)

data[i]=r.ReadInt32();

r.Close();

Console.WriteLine("文件的內容如下:");

foreach(intmindata)Console.Write("{0},",m);}}4.1.3StreamReader和StreamWriter類讀寫字符串讀寫字符串可以用StreamReader和StreamWriter類。常用StreamWriter類方法如下:構造函數(shù)StreamWriter(string

path,boolappend):path是要寫文件的路徑,如果該文件存在,并且append為false,則該文件被改寫。如果該文件存在,并且append為true,則數(shù)據(jù)被追加到該文件中。該文件不存在,將創(chuàng)建新文件。方法voidWriter(stringvalue):將字符串寫入流。方法voidWriter(charvalue):將字符寫入流?!纠?.6】寫字符串類型數(shù)據(jù)程序如下:usingSystem;usingSystem.IO;classProgram{ staticvoidMain(){StreamWriterw=newStreamWriter("d://g.text",false);w.Write(100);w.Write("100個");

w.Write("Endoffile");

w.Close();}}常用StreamReader類方法如下:構造函數(shù)StreamReader(stringpath):參數(shù)是要讀文件的路徑。方法intRead():從流中讀取一個字符,并使讀字符位置移動到下一個字符。返回代表讀出字符ASCII字符值的int類型整數(shù),如果沒有字符可以讀出,返回-1。如果sr是StreamReader對象,讀取一個字符的用法如下:charc=(char)sr.Read()。方法stringReadLine():從流中讀取一行字符并將數(shù)據(jù)作為字符串返回。行的定義是:兩個換行符("\n"或"\r\n")之間的字符序列。返回的字符串不包含回車或換行符?!纠?.7】讀字符串程序如下,請先用上例建一個文件,然后用此例讀出。usingSystem.Collections.Generic; classProgram{ staticvoidMain(){ stringsLine="";List<string>arrText=newList<string>();using(StreamReader

objReader=newStreamReader("d://g.text")){ do{sLine=objReader.ReadLine();

if(sLine!=null)arrText.Add(sLine);}

while(sLine!=null);}Console.WriteLine("文件的內容如下:");foreach(stringminarrText)Console.Write("{0}",m);}}程序運行結果:文件的內容如下:100100個Endoffile

4.1.4序列化對于一個復雜的數(shù)據(jù)結構,例如數(shù)組,用以上方法存入文件,就顯得過于復雜了。為了簡化這類問題,C#提出了序列化的概念,序列化包括序列化和反序列化,所謂序列化就是把類的對象作為一個整體存入文件,反序列化則是相反的過程?!纠?.8】下邊的例子完成了一個哈希表對象的序列化。usingSystem.Collections.Generic;usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.Runtime.Serialization;classProgram{staticvoidMain(){Dictionary<string,string>h=newDictionary<string,string>();

h.Add("鍵1","值1");

h.Add("鍵2","值2");

h.Add("鍵3","值3");

FileStream

fs=newFileStream(@"d:/d.dat",FileMode.Create);

BinaryFormatterformatter=newBinaryFormatter();

formatter.Serialize(fs,h);

fs.Close();

fs=newFileStream(@"d:/d.dat",FileMode.Open);

h.Clear();h=(Dictionary<string,string>)formatter.Deserialize(fs);

fs.Close();

foreach(KeyValuePair<string,string>h1inh)Console.WriteLine("{0}:{1};",h1.Key,h1.Value);}}運行結果:鍵1:值1;鍵2:值2;鍵3:值3;【例4.9】自己定義的類也可以序列化,只要在類定義前增加[Serializable]即可,下邊例子首先定義了一個可序列化的類Person,建立若干Person類對象,存到List類對象中,并將List類對象序列化。usingSystem.Collections.Generic; usingSystem.Runtime.Serialization.Formatters.Binary;usingSystem.Runtime.Serialization;namespace{ [Serializable]publicclassPerson {privatestringP_name="張三"; privateint

P_age=12; publicstringName {get{returnP_name;} set{P_name=value;}}publicintAge {get{returnP_age;} set{P_age=value;}}}classClass1{[STAThread]staticvoidMain(string[]args){List<Person>h=newList<Person>(); Personp=newPerson();

h.Add(p); p=newPerson();

p.Name="李四";

p.Age=24;

h.Add(p);

FileStream

fs=newFileStream(@"d:/d.dat",FileMode.Create);

BinaryFormatterformatter=newBinaryFormatter();

formatter.Serialize(fs,h);

fs.Close();

fs=newFileStream(@"d:/d.dat",FileMode.Open);

h.Clear();h=(List<Person>)formatter.Deserialize(fs);

fs.Close();

foreach(Persondeinh)

Console.WriteLine("Name={0},Age={1};",de.Name,de.Age);} }}運行結果如下:Name=張三,Age=12;Name=李四,Age=24;4.1.5Stream類的其他派生類Stream類的其他派生類包括:MemoryStream、BuffereStream、NetworkStream。其中MemoryStream類把文件放到內存中,極大地提高了文件讀寫速度。BuffereStream類為文件讀寫建立一個緩沖區(qū),寫文件先把文件存到緩沖區(qū)中,緩沖區(qū)滿了以后,才寫入物理設備。先從文件讀入較多數(shù)據(jù)到緩沖區(qū),讀文件先從緩沖區(qū)讀,緩沖區(qū)沒有所需數(shù)據(jù),才再一次從物理設備讀數(shù)據(jù)到緩沖區(qū),用這樣的方法改善文件讀寫的性能。NetworkStream類把網(wǎng)絡傳輸?shù)臄?shù)據(jù)也看作流。請用幫助系統(tǒng)查看這些類的用法。4.2File類和FileInfo類C#語言中通過File和FileInfo類來創(chuàng)建、復制、刪除、移動和打開文件。在File類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能,但File類不能建立對象。FileInfo類使用方法和File類基本相同,但FileInfo類能建立對象。在使用這兩個類時需要引用System.IO命名空間。這里重點介紹File類的使用方法。4.2.1File類常用的方法方法定義使用說明voidAppendText(string

path,stringcontents)打開參數(shù)1指定文件,向文件追加參數(shù)2指定字符串,然后關閉文件。如果文件不存在,創(chuàng)建文件后寫入指定字符串。voidCopy(string

sFName,string

dFName,bool

overW)意義見4.2.4節(jié)FileStream

Create(Stringpath)返回按參數(shù)指定路徑建立的新文件流。voidDelete(Stringpath)刪除參數(shù)指定的文件。文件不存在,不引發(fā)異常bool

Exists(Stringpath)檢查參數(shù)指定路徑文件是否存在,存在返回trueFileAttributes

GetAttributes(Stringpath)返回參數(shù)指定文件的屬性。DateTime

GetCreationTime(Stringpath)返回參數(shù)指定文件或文件夾的創(chuàng)建日期和時間。DateTime

GetLastAccessTime(Stringpath)返回指定文件或文件夾最近訪問日期時間。方法定義使用說明DateTime

GetLastWriteTime(Stringpath)返回指定文件或文件夾最近修改日期時間。voidMove(Stringpath1,Stringpath2)移動參數(shù)1指定的文件到參數(shù)2指定的文件夾。FileStream

Open(Stringpath,FileModem)返回參數(shù)1指定文件的可讀寫的FileStream類對象,參數(shù)2指定保留還是改寫現(xiàn)有文件的內容、文件不存在是否創(chuàng)建該文件。FileStream

OpenRead(Strings)返回參數(shù)指定文件的只讀FileStream類對象。FileStream

OpenWrite(Strings)返回參數(shù)指定文件的只寫FileStream類對象。voidSetAttributes(string

path,FileAttributes

fileAttributes)按照參數(shù)2指定屬性修改參數(shù)1指定文件的屬性,具體使用見4.2.6節(jié)。voidSetCreationTime(String

s,DateTimed)設置參數(shù)指定文件的創(chuàng)建日期和時間。voidSetLastAccessTime(String

s,DateTimed)設置指定文件最近訪問日期和時間。voidSetLastWriteTime(String

s,DateTimed)設置指定文件最近修改的日期和時間。4.2.2判斷文件是否存在判斷文件是否存在的方法聲明如下:publicstaticbool

Exists(stringpath);該方法判斷參數(shù)指定的文件是否存在,參數(shù)path指定文件路徑。如果文件存在,返回true,如果文件不存在,或者訪問者不具有訪問此文件的權限,或者path描述一個目錄,返回false。下面的代碼段判斷是否存在c:\Example\e1.txt文件:

if(File.Exists(@"c:\Example\e1.txt")){…}

4.2.3刪除文件刪除文件方法:publicstaticvoidDelete(stringpath);該方法刪除參數(shù)指定的文件,參數(shù)path指定要刪除的文件路徑。【例4.10】下面的程序刪除用戶指定文件。usingSystem;usingSystem.IO;classProgram{ staticvoidMain(){ Console.WriteLine("請鍵入要刪除的文件的路徑:");stringpath=Console.ReadLine();

if(File.Exists(@path))

File.Delete(@path);else

Console.WriteLine("文件不存在!");}}4.2.4復制文件復制文件方法:publicstaticvoidCopy(string

sFName,string

dFName,bool

overW);

該方法將參數(shù)sFName指定文件拷貝到參數(shù)destFileName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果OverW為true,而且文件名為dFName的文件已存在的話,將會被復制過去的文件所覆蓋?!纠?.11】文件復制例子如下:classProgram{ staticvoidMain(){Console.WriteLine("請鍵入要拷貝的源文件的路徑:");stringpath=Console.ReadLine();

Console.WriteLine("請鍵入要拷貝的目的文件的路徑:");stringpath1=Console.ReadLine();

if(File.Exists(@path)) {if(!File.Exists(@path1))File.Copy(@path,@path1,true);else

Console.WriteLine("目的文件存在或目的路徑非法!");}else

Console.WriteLine("源文件不存在!");}}4.2.5移動文件移動文件方法:publicstaticvoidMove(string

sFName,string

dFName);該方法將參數(shù)sFName指定文件移動到參數(shù)dFName指定的目錄,修改文件名為參數(shù)dFName指定的文件名,如果目標文件已經(jīng)存在,或者路徑格式不對,將引發(fā)異常。注意,只能在同一個邏輯盤下進行文件轉移。如果試圖將c盤下的文件轉移到d盤,將發(fā)生錯誤。下面的代碼可以將c:\Example下的e1.txt文件移動到c盤根目錄下。File.Move(@"c:\Example\BackUp.txt",@"c:\BackUp.txt");【例4.12】FileInfo類方法MoveTo可將一個邏輯盤文件移到另一個邏輯盤,例子如下:classProgram{ staticvoidMain(){Console.WriteLine("請鍵入要移動的源文件的路徑:");stringpath=Console.ReadLine();Console.WriteLine("請鍵入要移動的目的文件的路徑(包括文件名):");stringpath1=Console.ReadLine();if(File.Exists(@path)){ if(!File.Exists(@path1)){FileInfo

fi=newFileInfo(@path);fi.MoveTo(@path1);}else

Console.WriteLine("目的文件存在或路徑非法!");}else

Console.WriteLine("源文件不存在!");}}

4.2.6設置文件屬性設置文件屬性方法:publicstaticvoidSetAttributes(string

path,FileAttributes

fileAbs);參數(shù)path指定要修改屬性的文件路徑;參數(shù)fileAbs指定要修改的文件屬性,可以是如下數(shù)值:Archive(存檔)、Compressed(壓縮文件)、Directory(目錄文件)、Encrypted(加密)、Hidden(隱藏)、Normal(普通文件)、ReadOnly(只讀文件)、System(系統(tǒng)文件)、Temporary(臨時文件)。下面代碼設置文件c:\e1.txt的屬性為只讀、隱藏。

File.SetAttributes(@"c:\e1.txt",FileAttributes.ReadOnly|FileAttributes.Hidden);

4.2.7得到文件的屬性方法聲明如下:publicstaticFileAttributes

GetAttributes(stringpath);方法返回參數(shù)指定的文件的FileAttributes,如果未找到路徑或文件,返回-1?!纠?.13】得到文件的屬性例子如下:usingSystem;usingSystem.IO;classProgram{ staticvoidMain(){ Console.WriteLine("請鍵入要得到屬性的文件路徑:");stringpath=Console.ReadLine();

if(File.Exists(@path)) {FileAttributesattributes=File.GetAttributes(@path);

if((attributes&FileAttributes.Hidden)==FileAttributes.Hidden)

Console.WriteLine("隱藏文件");Else

Console.WriteLine("不是隱藏文件");FileInfofileInfo=newFileInfo(@path);Console.WriteLine(fileInfo.FullName+"文件長度="+fileInfo.Length+",建立時間="+fileInfo.CreationTime);Console.WriteLine("建立時間="+File.GetCreationTime(@path)+"最后修改時間="+File.GetLastWriteTime(@path)+"訪問時間="+File.GetLastAccessTime(@path));}Else

Console.WriteLine("文件不存在!");}}4.3Directory類和DirectoryInfo類C#語言中通過Directory類來創(chuàng)建、復制、刪除、移動文件夾。在Directory類中提供了一些靜態(tài)方法,使用這些方法可以完成上述功能。Directory類不能建立對象。DirectoryInfo類使用方法和Directory類基本相同,但DirectoryInfo類能建立對象。在使用這兩個類時需要引用System.IO命名空間。4.3.1Directory類常用的方法方法定義使用說明DirectoryInfo

CreateDirectory(strings)創(chuàng)建參數(shù)指定路徑中所有目錄和子目錄。voidDelete(stringpath)刪除參數(shù)指定目錄。bool

Exists(stringpath)檢查參數(shù)指定路徑的文件夾是否存在,存在,返回true。stringGetCurrentDirectory()獲取應用程序的當前工作目錄。string[]GetDirectories(strings)返回字符串數(shù)組,記錄參數(shù)指定的文件夾中所有子文件夾名稱。stringGetDirectoryRoot(strings)返回參數(shù)指定路徑的卷信息、根信息的字符串。string[]GetFiles(strings)返回字符串數(shù)組,記錄指定文件夾中所有文件名稱。方法定義使用說明string[]GetFileSystemEntries(strings)返回指定目錄中所有文件和子目錄名稱。string[]GetLogicalDrives()返回字符串數(shù)組記錄計算機所有驅動器名稱,如A:、C:。DirectoryInfo

GetParent(strings)

返回參數(shù)指定路徑的父文件夾。voidMove(Strings1,Strings2)將參數(shù)1指定文件或文件夾及包含的文件、子文件夾移動到新位置。見4.3.5節(jié)。voidSetCurrentDirectory(strings)將參數(shù)指定目錄設置為應用程序當前工作目錄。GetCreationTime()、GetLastWriteTime()、GetLastAccessTime()、SetCreationTime()、SetLastAccessTime和SetLastWriteTime

見4.2.1節(jié)同名函數(shù)。4.3.2判斷目錄是否存在方法聲明如下:publicstaticbool

Exists(stringpath);該方法判斷參數(shù)指定目錄是否存在,參數(shù)path指定目錄的路徑。如果目錄存在,返回true,如果目錄不存在,或者訪問者不具有訪問此目錄權限,返回false。下面代碼判斷是否存在c:\Dir1\Dir2目錄。

if(Directory.Exists(@"c:\Dir1\Dir2")){…}

4.3.3創(chuàng)建目錄創(chuàng)建目錄方法:publicstaticDirectoryInfo

CreateDirectory(stringpath);方法按參數(shù)path指定的路徑創(chuàng)建所有目錄及其子目錄。如果由參數(shù)path指定的目錄已存在,或者參數(shù)path指定的目錄格式不正確,將引發(fā)異常?!纠?.14】下面的程序創(chuàng)建按用戶輸入的目錄名創(chuàng)建目錄:classProgram{ staticvoidMain(){Console.WriteLine("請鍵入要創(chuàng)建的目錄路徑:");stringpath=Console.ReadLine();

if(!Directory.Exists(@path))

Directory.CreateDirectory(@path);else

Console.WriteLine("目錄已存在或目錄非法!");}}4.3.4刪除目錄刪除目錄方法:publicstaticvoidDelete(string

path,boolrecursive);該方法刪除參數(shù)path指定的目錄。方法的第二個參數(shù)為bool類型,為true可以刪除非空目錄;若為false,則僅當目錄為空時才可刪除?!纠?.15】下面的程序刪除用戶指定目錄。classProgram{ staticvoidMain(){ Console.WriteLine("請鍵入要刪除的目錄的路徑:");stringpath=Console.ReadLine();

if(Directory.Exists(@path))

Directory.Delete(@path);else

Console.WriteLine("目錄不存在或目錄非法!");}}4.3.5移動目錄移動目錄方法:publicstaticvoidMove(string

sourceDirName,string

destDirName);該方法將文件或目錄及其子目錄移到新位置,如果目標目錄已經(jīng)存在,或者路徑格式不對,將引發(fā)異常。注意,只能在同一個邏輯盤下進行目錄轉移。如果試圖將c盤下的目錄轉移到d盤,將發(fā)生錯誤。下面的代碼可以將目錄c:\Dir1\Dir2移動到c:\Dir3\Dir4。Directory.Move(@"c:\Dir1\Dir2",@"c:\Dir3\Dir4");【例4.16】DirectoryInfo類方法MoveTo可以將一個邏輯盤的目錄移到另一個邏輯盤,例子如下:usingSystem;usingSystem.IO;classProgram{ staticvoidMain(){Console.WriteLine("請鍵入要移動的源目錄的路徑:");stringpath=Console.ReadLine();

Console.WriteLine("請鍵入要移動的目的目錄的路徑:");stringpath1=Console.ReadLine();if(Directory.Exists(@path)){if(!Directory.Exists(@path1)){DirectoryInfodir=newDirectoryInfo(@path);dir.MoveTo(@path1);}elseConsole.WriteLine("目的目錄已存在!");}else

Console.WriteLine("源目錄不存在!");}}4.3.6獲取當前目錄下所有子目錄該方法聲明如下:publicstaticstring[]GetDirectories(stringpath);【例4.17】下面的程序讀出用戶指定目錄下的所有子目錄,并將其在屏幕顯示。classProgram{ staticvoidMain(){Console.WriteLine("請鍵入目錄的路徑:");stringpath=Console.ReadLine();

if(Directory.Exists(@path)){string[]Directorys;

Directorys=Directory.GetDirectories(@path);

foreach(string

aDirinDirectorys)

Console.WriteLine(aDir);}else

Console.WriteLine("目錄不存在!");}}獲得所有邏輯盤符方法定義如下:string[]AllDrivers=Directory.GetLogicalDrives();4.3.7獲取當前目錄下的所有文件該方法聲明如下:publicstaticstring[]GetFiles(stringpath);【例4.18】下面的程序讀出用戶指定目錄下的所有文件名,并將文件在屏幕上顯示。classProgram{ staticvoidMain(){Console.WriteLine("請鍵入目錄的路徑:");stringpath=Console.ReadLine();

if(Directory.Exists(@path)){string[]files;files=Directory.GetFiles(@path);

foreach(string

aFileinfiles)

Console.WriteLine(aFile);}ElseConsole.WriteLine("目錄不存在!");}}4.3.8設置目錄屬性與文件屬性相同,目錄屬性也是使用FileAttributes來進行設置的。下面的代碼設置c:\Dir1\Dir2目錄為只讀、隱藏。DirectoryInfo

DirInfo=newDirectoryInfo(@"c:\Dir1\Dir2");DirInfo.Atttributes=FileAttributes.ReadOnly|FileAttributes.Hidden;4.4例子:在指定文件夾中查找文件【例4.19】Windows操作系統(tǒng)提供了一個查找文件的程序,可以查找指定文件夾中的指定文件,本例實現(xiàn)此功能。具體實現(xiàn)步驟如下,ListView控件用法參見2.26節(jié)例子。(1)新建項目。增加引入命名空間語句。usingSystem.IO;usingSystem.Collections.ObjectModel; (2)定義一個集合類,必須是ObservableCollection類派生類。publicclassmyFiles:ObservableCollection<FileInfo>{}(3)為Window1類增加myFiles類對象和bool變量:myFiles

FileInfos=newmyFiles();bool

isStop=true;(4)下一步要用到System.Windows.Forms.FolderBrowserDialog類,該類是選擇文件夾對話框,屬性SelectedPath是用戶選定的文件夾路徑。該類是WinForm控件,為了使用這個類,右擊解決方案資源管理器中的“引用”,在打開的快捷菜單中選擇“添加引用…”菜單項,打開“添加引用”對話框,在對話框中添加引用:System.Windows.Forms。(5)為窗體增加一個方法:FindFiles(DirectoryInfo

dir,string

FileName),該方法是在第一個參數(shù)指定的文件夾中查找第二個參數(shù)指定的所有文件。在一個文夾中可能還有子文件夾,子文件夾中可能還有子文件夾,因此要在第一個參數(shù)指定的文件夾中和其子文件夾中查找第二個參數(shù)指定的所有文件。為了實現(xiàn)能夠查找所有文件夾中的同名文件,采用遞歸調用方法,如果在一個文件夾中存在子文件夾,再一次調用函數(shù)自己,查找子文件夾中的文件。具體實現(xiàn)代碼如下:voidFindFiles(DirectoryInfodir,stringFileName){if(isStop)return;

FileInfo[]files=dir.GetFiles(FileName);if(files.Length!=0){foreach(FileInfo

aFileinfiles)

FileInfos.Add(aFile); }DirectoryInfo[]dirs=dir.GetDirectories();if(dirs.Length!=0){foreach(DirectoryInfo

aDirindirs)

FindFiles(aDir,FileName);} }

(6)在Grid標記中增加如下標記:<ListViewName="listView1"Margin="0,0,0,41"SelectionMode="Single"><ListView.View><GridView

AllowsColumnReorder="true"ColumnHeaderToolTip="文件列表"><GridViewColumnHeader="文件名稱"Width="100"DisplayMemberBinding="{BindingPath=Name}"/><GridViewColumnHeader="所在文件夾"Width="200"DisplayMemberBinding="{BindingPath=Directory.FullName}"/><GridViewColumnHeader="文件大小"Width="75"DisplayMemberBinding="{BindingPath=Length}"/><GridViewColumnHeader="文件修改時間"Width="100“DisplayMemberBinding="{BindingPath=LastWriteTime}"/></GridView>

</ListView.View></ListView><TextBlockHeight="19"HorizontalAlignment="Left"Margin="10,0,0,5"VerticalAlignment="Bottom"Width="114"Text="指定搜索文件的名稱"/><TextBoxHeight="23"Margin="130,0,208,9"Name="textBox1"VerticalAlignment="Bottom"/><ButtonHeight="22"HorizontalAlignment="Right"Margin="0,0,103,10"Name="button1"VerticalAlignment="Bottom"Width="81"Click="button1_Click">開始搜索</Button><ButtonHeight="24"HorizontalAlignment="Right"Margin="0,0,12,10.157"Name="button2"VerticalAlignment="Bottom"Width="77">停止搜索</Button>(7)在Window1類構造函數(shù)最后增加語句:listView1.ItemsSource=FileInfos;(8)為"開始搜索"按鈕增加事件函數(shù)如下:privatevoidbutton1_Click(objectsender,RoutedEventArgse){strings=textBox1.Text;if(s=="")

MessageBox.Show("文件名稱名稱不能為空");else{intn=s.IndexOf(".");if(n==-1)s+=".*";

System.Windows.Forms.FolderBrowserDialog

fb=newSystem.Windows.Forms.FolderBrowserDialog();if(fb.ShowDialog()==System.Windows.Forms.DialogResult.OK){DirectoryInfodir=newDirectoryInfo(@fb.SelectedPath.ToString());

isStop=false;

FileInfos.Clear();listView1.ItemsSource=FileInfos;

FindFiles(dir,s);}}}(9)為"停止搜索"按鈕增加事件函數(shù)如下:privatevoidbutton2_Click(objectsender,RoutedEventArgse){isStop=true;}(10)按以上設計,無法在標題為"停止搜索"按鈕的單擊事件處理函數(shù)中用代碼停止搜索,可行辦法是,查找文件在另一個線程中進行,在單擊"停止搜索"按鈕后,停止搜索線程。(11)編譯運行,查找所選目錄的所有*.bmp文件的運行效果如圖。4.5例子:鼠標拖放打開文件【例4.20】本例從Windows資源管理器中將一個Text文件拖到TextBox控件打開。(1)新建項目。增加引入命名空間語句。usingSystem.IO;(2)在Window1類定義變量:stringfileName;(3)在Grid標記中增加如下標記,其中屬性TextWrapping="Wrap"允許換行。<TextBoxName="textBox1"AllowDrop="True"PreviewDragOver="textBox1_PreviewDragOver"Drop="textBox1_Drop"TextWrapping="Wrap"/>(4)拖放將越過控件時產(chǎn)生的事件PreviewDragOver事件函數(shù)如下:privatevoidtextBox1_PreviewDragOver(objectsender,DragEventArgse){if(e.Data.GetDataPresent(DataFormats.FileDrop,true)){string[]fileNames=e.Data.GetData(DataFormats.FileDrop,true)asstring[];if(fileNames.Length==1){if(File.Exists(fileNames[0])){fileName=fileNames[0];

e.Handled=true;}}}}(5)將拖放對象放到控件產(chǎn)生的事件Drop事件函數(shù)如下:privatevoidtextBox1_Drop(objectsender,DragEventArgse){StreamReader

fileToLoad=newStreamReader(fileName);textBox1.Text=fileToLoad.ReadToEnd();

fileToLoad.Close();

this.Title="FileLoaded:"+fileName;}(6)編譯運行,將Windows資源管理器一個Text文件拖到TextBox控件,文件被顯示?!纠?.21】本例將例4.19找到的text文件拖到例4.20的TextBox控件打開。修改例4.19,修改具體步驟如下:(1)設置ListView控件屬性SelectionMode="Single",不允許多選。(2)為ListView控件的MouseLeftButtonDown事件增加事件函數(shù)如下:privatevoidlistView1_MouseLeftButtonDown(objectsen

溫馨提示

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

評論

0/150

提交評論