17.2.1 目錄管理
.Net框架結構在名字空間System.IO中為我們提供了Directory類來進行目錄管理。利用它,我們可以完成對目錄及其子目錄進行創建、移動、浏覽等操作,甚至還可以定義隱藏目錄和只讀目錄。
Directory的構造函數形式如下:
public Directory(string path);
其中的參數path表示目錄所在的路徑。
Directory的主要屬性有:
●Attributes:0x01表示只讀,0x02表示隱藏。
●Name:當前路徑名。
●Parent:上一級父目錄名。
●Root:所在根目錄名。
●Creation Time:目錄創建時間。
●LastAccessTime:上一次訪問目錄的時間。
●LastWriteTime:上一次修改目錄的時間。
我們常用到的Directory類的一些成員方法有:
●CreateDirectory(string path):創建子目錄。
●CreateDirectories(string path):創建多級子目錄。
●CreateFile(string filename):在當前目錄下創建一個新文件。
●Delete():刪除目錄。
下面的例子中,我們利用Directory的CreateDirectory和CreateDirectories方法創建一級和二級目錄。
程序清單17-1:
using System; using System.IO; class DirectoryTest { public static void Main() { Directory d=new Directory("c:\\C#"); Directory d1; Directory d2; try{ d1=d.CreateSubdirectory("file1"); } catch(IOException e) { Console.WriteLine("directory file1 failed because:{0}",e); return; } try{ d2=d.CreateSubdirectories("file1\\file2"); //等於d2=d1.CreateSubDirectory("file2"); } catch(IOException e) { Console.WriteLine("directory file2 failed because:{0}",e); return; } Console.WriteLine("Create directory successfully!"); } }
上面例子中的異常IOException表示准備創建的目錄名已經存在。System.IO中提供了各種輸入輸出的異常,便於我們了解任務失敗的原因所在,或者是給程序的用戶提示信息。
同樣我們可以進行目錄刪除操作。
程序清單17-2:
using System; using System.IO; class DirectoryTest { public static void Main() { Directory d=new Directory("c:\\C#file1"); Directory[] subdir; try{ subdir=d.GetDirectories(); } catch(DirectoryNotFoundException e) { Console.WriteLine("Can not find such a directory because:{0}",e); return; } foreach(Directory dir in subdir){ dir.Delete(); } d.Delete(); Console.WriteLine("Delete successfully!"); } }
17.2.2 文件管理
File類通常和FileStream類協作來完成對文件的創建、刪除、拷貝、移動、打開等操作。
File類的構造函數形式為:
public File(string fileName);
同樣,File類也有自己的屬性,如絕對路徑名DerictoryName、創建時間CreationTime、上次訪問時間LastAccessTime、上次修改時間LastWriteTime、文件長度Length等。
File類為我們提供的方法主要有CopyTo、MoveTo、Delete等,利用它們可以完成一些基本的文件管理。
下面給出的例子用於簡單的文件拷貝。這是一個帶命令行參數的可執行文件,第一個參數表示源文件的絕對路徑名,第二個參數表示目標文件的絕對路徑名。
程序清單17-3:
using System; using System.IO; class FileTest { public static void Main(String[] args) { //驗證參數輸入是否正確 string sourcename; string targetname; try{ sourcename=args[0]; } catch { Console.WriteLine("Please input the name of the source file correctly"); return; } try{ targetname=args[1]; } catch { Console.WriteLine("Please input the name of the target file correctly"); return; } //進行文件拷貝操作 File file; try{ file=new File(sourcename); } catch { Console.WriteLine("Can not open the source file named'{0}'",sourcename); return; } try{ file.CopyTo(targetname,true); } catch { Console.WriteLine("Can write the target file named'{0}'",targetname); return; } Console.WriteLine("File copys successfully!"); } }
上面我們用到了File的CopyTo方法。若改為MoveTo方法,則程序可以用於文件的移動操作。
下面的例子用於刪除當前目錄下的所有文件。
程序清單17-4:
using System; using System.IO; class FileTest { public static void Main() { Console.WriteLine("Are you sure to delete all the files in current directory?"); Console.WriteLine("Press 'Y' then enter to continue,any other key to abort"); int a=Console.Read(); if(a=='Y'||a=='y'){ Console.WriteLine("Deleting the files..."); } else{ Console.WriteLine("canceled by user"); return; } Directory dir=new Directory("."); foreach(File f in dir.GetFiles()){ f.Delete(); } } }
其中,語句foreach(File f in dir.GetFiles())表示查找當前所有文件。Directory類的成員方法GetFiles有兩種重載形式:
public File[] GetFiles();
public File[] GetFiles(string searchCriteria);
後面一種方法中的參數表示搜索文件的條件。
我們對程序17-4可以稍做改動,把最後一段代碼改寫為:
foreach(File f in dir.GetFiles("*.exe")){
f.Delete();
}
這樣,程序實際上是變成了刪除當前目錄下的所有擴展名為.exe的文件。
值得一提的是,作者在使用File.Delete方法時遇到了一個有趣的現象。文件刪除後,在Windows的回收站中找不到,但是使用工具軟件Norton Unerase Wizard卻成功地找到並恢復了被刪除了的文件,而且文件名還保存完好(Windows徹底刪除的文件恢復時文件名的第一個字符已被刪除)。看來File.Delete方法也並不是徹底地抹去文件的內容,而只是對被刪除的文件作出某個標記而已。