目錄
管理文件系統主要是對計算機中文件和目錄的管理,例如,讀取文件信息、刪除文件和讀取目錄信息等。這些功能的實現主要是由System.IO命名空間下的類對文件和目錄進行操作
System.IO命名空間為目錄和文件的操作提供了必要的類、方法和屬性
在System.IO命名空間中,提供了Directory類和DirectoryInfo類來進行目錄管理。使用這兩個類可以完成對目錄及其子目錄的創建、移動、浏覽等操作,甚至還可以定義隱藏目錄和只讀目錄
Directory類的所有方法都為靜態方法,因此無需創建對象即可調用,這些方法可以操縱和查詢任何目錄的信息;而DirectoryInfo類需要有實例成員才可以調用其方法,從而有效地對一個目錄進行多種操作。DirectoryInfo類實例化後,還可以通過其屬性獲取目錄的創建時間和最後修改時間等狀態
1、DirectoryInfo類的常用屬性
DirectoryInfo類的屬性可以獲取或設置當前目錄的相關屬性,下面創建一個示例,使用Attributes等屬性設置並獲C:\Users\Eniac\Desktop\TestDirectory目錄的相關屬性信息,代碼如下:
string dirPath = "C:\\Users\\Eniac\\Desktop\\TestDirectory"; //目錄的絕對路徑 if (Directory.Exists(dirPath)) //如果目錄存在 { DirectoryInfo info = new DirectoryInfo(dirPath); //初始化當前目錄實例 info.Attributes = FileAttributes.ReadOnly | FileAttributes.Hidden; //利用Attributes屬性設置目錄為只讀和隱藏 /*利用DirectoryInfo實例的屬性獲得當前目錄的信息*/ label1.Text += "全部名稱 : " + info.FullName + "\n"; label1.Text += "目錄創建時間 : " + info.CreationTime.ToString() + "\n"; label1.Text += "最後一次訪問該目錄的時間: " + info.LastAccessTime.ToString() + "\n"; label1.Text += "最後一次修改目錄時間 : " + info.LastWriteTime.ToString() + "\n"; label1.Text += "DirectoryInfo實例名稱 : " + info.Name + "\n"; label1.Text += "父目錄 : " + info.Parent + "\n"; label1.Text += "路徑根部分 : " + info.Root.ToString() + "\n"; } else { label1.Text = "該目錄不存在,請檢驗路徑是否正確"; }
執行結果如下圖:
2、Directory類的常用方法
(1)Exists方法
Exists方法接收一個參數,該參數表示包含當前目錄路徑的字符串,Exists方法返回結果指示目錄是否存在,如果存在,返回true,否則返回false。如上例if語句的判別條件:
if (Directory.Exists(dirPath)) //如果目錄存在
(2)CreatDirectory方法
CreatDirectory方法接受一個創建目錄路徑的String類型參數,該方法會根據此路徑創建新目錄,並且該方法返回一個DirectoryInfo實例,如果創建的目錄已經存在,則返回代表指定目錄的類實例,不會創建目錄,也不會產生異常。通常用法如下:
if (!Directory.Exists(dirPath)) //如果目錄不存在就創建目錄 { Directory.CreateDirectory(dirPath); }
(3)Delete方法
Delete方法可以刪除指定的目錄,該方法為一個重載方法,可以接收一個參數或兩個參數。當方法接收一個參數時,該參數為指定目錄的路徑,這種情況下只能刪除指定的空目錄,如果目錄不空,系統會拋出異常;當該方法接收兩個參數時,第二個參數為bool值,如果為true,則可以刪除非空目錄。通常用法如下:
if(Directory.Exists(dirPath)) //如果目錄存在 { try { Directory.Delete(dirPath,true);//刪除目錄以及目錄中所有的子目錄和文件 } catch(Exception ex) //當出現異常時,系統拋出異常 { MessageBox.Show(ex.Message.ToString()); } }
(4)Move方法
Move方法表示將指定目錄移動到新位置,並提供指定新目錄名。該方法能夠接收兩個參數,其中第一個參數表示要移動的目錄路徑,第二個參數表示目標路徑(加上指定的新目錄名),當要移動的目錄和目標路徑的父目錄相同時,Move就不再移動目錄而是重命名目錄。Move方法不能把目錄在不同的邏輯驅動器之間進行移動,格式如下:
string dirPath1 = "C:\Users\Eniac\Desktop\dir1"; string dirPath2 = "C:\Program Files\dir2"; Directory.Move(dirPath1,dirPath2); //把目錄dir1移動到C:\Program Files目錄下並重命名為dir2
另外Directory類還有以下方法,就不一一詳細介紹了:
Directory.GetFiles(dirPath); //獲取指定目錄中所有文件的文件名(文件列表,包含子目錄) Directory.GetDirectories(dirPath); //獲取指定目錄下所有子目錄名 Directory.GetFileSystemEntries(dirPath); //獲取指定目錄中的所有子目錄名及文件名
上述三個方法均有多參數的重載方法,用於在指定目錄下搜索相關文件或子目錄,多出來的參數表示指定目錄下的搜索模式匹配
DirectoryInfo類中還有一些方法,DirectoryInfo類對象通過使用這些方法可以操作當前文件,這些方法的使用跟Directory類的方法很類似,並且有很多功能也是相同的。具體使用時,如果用戶打算多次重用某個對象,可以考慮使用DirectoryInfo的實例方法,而不是Directory類相應的靜態方法,因為DirectoryInfo的實例方法並不總是需要進行安全檢查,默認情況下,該類將向所有用戶授予對新目錄的完全讀/寫訪問權限
由於DirectoryInfo類中的方法和Directory類的方法有很多相似之處,只是調試的方式不同,在此就不再對該類中的方法進行講解
System.IO命名空間的File類和FileInfo類提供有關文件管理的相關內容,例如創建、刪除、移動和打開文件等
File類的操作方式與Directory類相似,File類中的方法大多都為靜態方法;而FileInfo類和上文中講解的DirectoryInfo類相似,只有在實例化的情況下才可以使用其屬性和方法
1、FileInfo類的常用屬性
FileInfo類主要用於對實例對象的操作,跟DirectoryInfo類的操作方式比較相似,該類提供了很多屬性,通過FileInfo類的屬性可以獲得文件的相關信息。我們通過下面的程序簡單了解一下FileInfo類的屬性:
private void button1_Click(object sender, EventArgs e)//選擇文件 { /*此處用到了一個OpenFileDialog控件*/ if (openFileDialog1.ShowDialog() != DialogResult.OK)//打開失敗則退出 { return; } textBox1.Text = openFileDialog1.FileName;//把選中文件的絕對路徑填入文本框 } private void button2_Click(object sender, EventArgs e)//獲取詳細信息 { string filePath = textBox1.Text; //文件的絕對路徑 FileInfo info = new FileInfo(filePath);//初始化當前文件實例 label1.Text += "········文件名稱: " + info.Name + "\n"; label1.Text += "······文件完整路徑: " + info.FullName + "\n"; label1.Text += "····所在目錄完整路徑: " + info.DirectoryName + "\n"; label1.Text += "·······文件擴展名: " + info.Extension + "\n"; label1.Text += "········文件大小: " + info.Length / 1024 + "KB\n"; label1.Text += "······文件創建時間: " + info.CreationTime.ToString() + "\n"; label1.Text += "最後一次訪問該文件的時間: " + info.LastAccessTime.ToString() + "\n"; label1.Text += "·最後一次寫入該文件時間: " + info.LastWriteTime.ToString() + "\n"; label1.Text += "·····文件是否為只讀: " + info.IsReadOnly + "\n"; }
執行結果如下圖:
2、File類的常用方法
下面列出了File類的常用方法:
File.Exists(filePath); //用於判定指定文件是否存在 File.Create(filePath); //在指定路徑中創建文件 File.Delete(filePath); //刪除指定文件 File.Move(filePath1,filePath2);//把filePath1文件移動到指定的filePath2路徑 File.Copy(filePath1,filePath2);//把filePath1文件復制到指定的filePath2路徑 File.AppendAllText(filePath,String);//將字符串(第二個參數)追加到指定文件中,若文件不存在則此方法先創建文件再追加 File.ReadAllLines(filePath);//一次性讀取指定文件的所有行,返回一個字符串數組,數組元素是每一行的內容 File.ReadAllText(filePath);//一次性讀取指定文件的所有內容,返回一個包含全部文本內容的字符串 File.WriteAllLines(filePath,String[]);//一次將字符串數組的每一個元素作為一行寫入指定文件 File.WriteAllText(filePath,String);//一次性將字符串(第二個參數)寫入指定文件
上述後四種方法適用於文件讀寫的內容不是很多的情況下,在文件讀寫的時候會細講
FileInfo類中還有一些方法,FileInfo類對象通過使用這些方法可以操作當前文件,這些方法的使用跟File類的方法很類似,並且有很多功能也是相同的。具體使用時,如果用戶打算多次重用某個對象,可以考慮使用FileInfo的實例方法,而不是File類相應的靜態方法,因為FileInfo的實例方法並不總是需要進行安全檢查,默認情況下,該類將向所有用戶授予對新文件的完全讀/寫訪問權限
由於FileInfo類中的方法和File類的方法有很多相似之處,只是調試的方式不同,在此就不再對該類中的方法進行講解
Path類對包含文件或目錄路徑信息的String實例執行操作,並且以跨平台的方式執行這些操作。在不用的平台上,表示路徑的字符串可能不相同,文件的擴展名格式也不相同,因為這些不同Path類的字段以及Path類的某些成員的行為與平台相關
Path類的所有成員(方法和屬性)都是靜態的,因此無需具有路徑的實例即可被調用,這些成員使用戶可以快速方便地執行常見操作,例如確定文件擴展名是否是路徑的一部分,以及將兩個字符串合成一個路徑名
下面列出了Path類常用的方法及說明:
Path.GetExtension(path); //返回指定路徑字符串的擴展名 Path.GetFileNameWithoutExtension(path);//返回不具有擴展名的指定路徑字符串的文件名 Path.GetFileName(path); //返回具有擴展名的指定路徑字符串的文件名 Path.GetFullPath(path); //返回指定路徑字符串的絕對路徑 Path.ChangeExtension(path,extension);//更改路徑字符串的擴展名