標籤:blog 使用 os io 檔案 for ar 問題
C# 擷取檔案大小,建立時間,檔案資訊,FileInfo類的屬性工作表 2011-12-13 09:00:40| 分類: C# |舉報|字型大小 訂閱OpenFileDialog openFileDialog1 = new OpenFileDialog();if(openFileDialog1.ShowDialog() == DialogResult.OK){openFileDialog1.FileName;System.IO.FileInfo file = new System.IO.FileInfo(openFileDialog1.FileName);file.Name;//檔案名稱file.Length.ToString();//大小",file.LastAccessTime.ToString();//最後訪問時間file.LastWriteTime.ToString();//最後修改時間file.DirectoryName;//路徑}FileInfo類是一個密封類,它可以用來建立、複製、刪除、移動和開啟檔案的執行個體方法。FileInfo類包括6個屬性,可以用來擷取檔案的名稱、完整路徑等,具體說明如表21.9所示。表21.9 FileInfo類的屬性工作表屬 性 說 明 屬 性 說 明Directory擷取父目錄Exists指定當前檔案是否存在DirectoryName擷取檔案的完整路徑Length擷取當前檔案的大小(位元組)IsReadOnly擷取或設定當前檔案是否為唯讀Name擷取檔案的名稱FileInfo和DirectoryInfo類一樣,也包括了FileSystemInfo類繼承而來的屬性,在此不做詳細介紹。除了上述屬性之外,FileInfo類還包括執行個體方法,具體說明如表21.10所示。表21.10 FileInfo類的執行個體方法表方 法 說 明 方 法 說 明Create()建立檔案OpenRead()以唯讀方式開啟檔案Delete()刪除指定檔案OpenWrite()以唯寫方式開啟檔案MoveTo()將指定檔案移到新位置CreateText()建立寫入新文字檔的StreamWriterCopyTo()將現有檔案複製到新檔案OpenText()開啟指定文字檔,並準備從其檔案中讀取內容Replace()使用其他檔案的內容替換指定檔案的內容AppendText()建立一個StreamWriter,它可以想文字檔追加內容Open()開啟檔案其中,Create()、Delete()、MoveTo()、CopyTo()和Replace()方法用來操作檔案,它們依次可以用來建立、刪除、移動、複製和替換檔案。21.3.3 建立檔案建立檔案可以使用File類的Create()方法或者FileInfo類的Create()方法。【樣本21-18】 使用FileInfo類的Create()方法建立一個名稱為"my.ini"的檔案。1. FileInfo fi = new FileInfo("my.ini"); 2. fi.Create();分析:該樣本首先建立FileInfo類的執行個體fi,它被指定為my.ini檔案,然後調用Create()方法建立該檔案。新建立的my.ini檔案儲存在應用程式所在的目錄21.3.4 寫入檔案存在多種方法,可以將指定內容寫入到檔案,如File類的OpenWrite()方法、FileInfo類的OpenWrite()方法等。【樣本21-19】 使用FileInfo類的OpenWrite()方法將"這是一個設定檔。"字串寫入到名稱為my.ini的檔案中,具體步驟如下:(1)建立FileInfo類的執行個體fi,它被指定為my.ini檔案。(2)使用OpenWrite()方法開啟my.ini檔案,並儲存為FileStream類的執行個體fsw。(3)設定被寫入的內容("這是一個設定檔。"字串),並轉換為byte數組,儲存為dataw。(4)調用fsw執行個體的Write()方法將dataw數組中的內容寫入到my.ini檔案。(5)調用fsw執行個體的Close()方法關閉fsw執行個體。1. FileInfo fi = new FileInfo("my.ini"); 2. ///建立FileInfo類的執行個體fi 3. FileStream fsw = fi.OpenWrite(); 4. ///使用OpenWrite()方法開啟my.ini檔案 5. string valuew = "這是一個設定檔。"; 6. ///設定被寫入的內容 7. byte[] dataw = System.Text.Encoding.Unicode.GetBytes(valuew); 8. ///轉換為byte數組,儲存為dataw 9. fsw.Write(dataw,0,dataw.Length); 10. ///將dataw數組中的內容寫入到my.ini檔案 11. fsw.Close(); 12. ///調用fsw執行個體的Close()方法關閉fsw執行個體分析:上述範例程式碼運行之後,將"這是一個設定檔。"字串寫入到名稱為my.ini的檔案中。以記事本的方式查看my.ini檔案的內容,如 圖21.2所示。主要:my.ini檔案的內容已經被使用Unicode方式編碼過,所以不能看到該檔案的真實內容21.3.5 讀取檔案存在多種方法,可以從指定檔案中讀取內容,如File類的OpenRead()方法、FileInfo類的OpenRead()方法等。【樣本21-20】 使用FileInfo類的OpenRead()方法從my.ini檔案讀取內容,並轉換為一個字串(儲存為valuer),最終,將valuer的內容顯示在控制台。具體步驟如下:(1)建立FileInfo類的執行個體fi,它被指定為my.ini檔案。(2)使用OpenRead()方法開啟my.ini檔案,並儲存為FileStream類的執行個體fsr。(3)建立datar數組,用來儲存從my.ini檔案讀取的內容。(4)調用fsw執行個體的Read()方法讀取my.ini檔案的內容,並儲存到datar數組。(5)將datar數群組轉換為一個字串,並儲存為valuer。(6)顯示valuer的值。(7)調用fsw執行個體的Close()方法關閉fsw執行個體。1. FileInfo fi = new FileInfo("my.ini"); 2. ///建立FileInfo類的執行個體fi 3. FileStream fsr = fi.OpenRead(); 4. ///使用OpenRead()方法開啟my.ini檔案 5. byte[] datar = new byte[(int)fsr.Length]; 6. ///建立datar數組,儲存從my.ini檔案讀取的內容 7. fsr.Read(datar,0,(int)fsr.Length); 8. ///讀取my.ini檔案的內容,儲存到datar數組 9. string valuer = System.Text.Encoding.Unicode.GetString(datar); 10. ///將datar數群組轉換為string,儲存為valuer 11. Console.WriteLine(valuer); 12. ///顯示my.ini檔案的內容 13. fsr.Close(); 14. ///調用fsw執行個體的Close()方法關閉fsw執行個體分析:上述範例程式碼運行之後,將顯示"這是一個設定檔。"字串。21.3.6 移動檔案移動檔案可以使用以下2種方法中的任何一種。File類的Move()方法:將指定檔案移到新位置。【樣本21-21】 使用File類的Move()方法將my.ini檔案移動為my01.ini檔案。1. File.Move(@"my.ini","my01.ini");分析:上述代碼執行之後,實際上是建立了名稱為my01.ini的新檔案,並刪除了my.ini檔案。FileInfo類的MoveTo()方法:將指定檔案移到新位置。【樣本21-22】 建立FileInfo類的執行個體fi(表示"my.ini"檔案),並調用MoveTo()方法將my.ini檔案移動為my01.ini檔案。1. FileInfo fi = new FileInfo("my.ini"); 2. fi.MoveTo("my01.ini");分析:上述代碼執行之後,實際上是建立了名稱為my01.ini的新檔案,並刪除了my.ini檔案。21.3.7 刪除檔案刪除檔案可以使用以下2種方法中的任何一種。File類的Delete()方法:將刪除指定的檔案。【樣本21-23】 使用File類的Delete()方法刪除my.ini檔案。1. File.Delete(@"my.ini","my01.ini");FileInfo類的Delete()方法:將刪除指定的檔案。【樣本21-24】 建立FileInfo類的執行個體fi(表示my.ini檔案),並調用Delete()方法刪除my.ini檔案。1. FileInfo fi = new FileInfo("my.ini"); 2. fi.Delete("my.ini");21.4 執行個體:讀取目錄下指定類型的檔案的內容【執行個體21-1】 實現了讀取指定目錄下的、指定檔案類型的、所有檔案的內容,並在控制台中顯示讀取的內容。具體實現步驟如下:(1)開啟Visual Studio 2008整合式開發環境,並建立名稱為"Sample_21"的控制台應用程式。該應用程式的版本為.NET Framework 3.5。(2)右擊"解決資源方案管理器"面板中的Program.cs節點,開啟名稱為"Program.cs"的類檔案,並在該檔案中添加 ReaderFile (string path) 方法的程式碼。ReaderFile (string path)方法讀取指定檔案(由path參數指定)的內容,並返回讀取的內容。具體步驟如下:① 建立類型為string的fileData變數,用來儲存讀取的內容。② 在try語句中讀取檔案的內容。③ 建立讀取檔案內容的StreamReader類的執行個體reader,並指定該執行個體的編碼方式為作業系統的預設編碼方式。④ 調用ReadToEnd()方法從頭至尾讀取檔案的所有內容,並儲存為fileData變數。⑤ 關閉reader執行個體。⑥ 如果try語句發生異常,則在catch語句中拋出異常。綜合上述,ReaderFile(string path)方法的程式碼如下。1. /// <summary> 讀取檔案的內容 </summary> 2. public static string ReaderFile(string path) 3. { 4. string fileData = string.Empty; 5. try 6. { ///讀取檔案的內容 7. StreamReader reader = new 8. StreamReader(path,Encoding.Default); 9. fileData = reader.ReadToEnd(); 10. reader.Close(); 11. } 12. catch(ExceptI/On ex){throw new ExceptI 13. /On(ex.Message,ex);} ///拋出異常 14. return fileData; 15. }(3)在Program.cs檔案中添加ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法的程式碼。該方法讀取指定目錄(由path參數指定)下的、滿足過濾器(filter參數指定)的所有檔案的內容,讀取的內容都儲存到content參數(該參數為引用參數)中。具體步驟如下:① 判斷path參數是否合法。如果不合法,則中止該方法。② 建立目錄資訊的執行個體parentDi。③ 使用foreach語句和GetFiles()方法搜尋parentDi執行個體指定目錄下的、滿足過濾器(filter參數指定)的所有檔案。④ 如果foreach語句找到檔案,則依次讀取每一個檔案的內容,並儲存到content參數中。綜合上述,ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法的程式碼如下:1. /// <summary> 讀取子目錄下的所有檔案的內容 </summary> 2. private static void ReaderSubDirectory(string path,string filter,ref 3. StringBuilder content) 4. { ///判斷目錄是否正確 5. if(string.IsNullOrEmpty(path) == true) return; 6. ///建立目錄資訊的執行個體 7. DirectoryInfo parentDI = new DirectoryInfo(path); 8. ///讀取目前的目錄及其子目錄下的指定檔案的內容, 9. 都儲存到content變數中 10. foreach(FileInfo fi in parentDI. 11. GetFiles(filter,SearchOptI/On.AllDirectories)) 12. { 13. content.AppendLine(); 14. content.Append(ReaderFile(fi.FullName)); 15. content.AppendLine(); 16. } 17. }(4)在Program.cs檔案中添加ReaderDirectory(string path,string filter)方法的程式碼。該方法讀取指定目錄(由path參數指定)下的、滿足過濾器(filter參數指定)的所有檔案的內容,並返回讀取的內容。具體步驟如下:① 判斷path參數是否合法。如果不合法,則中止該方法。② 建立儲存讀取的內容的StringBuilder類的執行個體content。③ 如果filter參數為空白,則直接調用ReaderSubDirectory(string path,string filter,ref StringBuilder content)方法讀取path參數指定目錄(及其子目錄)下的所有檔案的內容。④ 如果filter參數不為空白,則首先將過濾器轉換為一個字串數組filters,然後使用foreach語句處理filters數組中每一個類型的檔案,並讀取path目錄(及其子目錄)下的、滿足過濾器的所有檔案的內容。⑤ 上述讀取檔案的內容,都儲存在content變數中。最後,將該變數轉換為一個字串,並返回該字串。綜合上述,ReaderDirectory(string path,string filter)方法的程式碼如下:1. /// <summary> 讀取指定目錄下的所有檔案 </summary> 2. public static string ReaderDirectory(string path,string filter) 3. { ///判斷目錄是否正確 4. if(string.IsNullOrEmpty(path) == true) return string.Empty; 5. StringBuilder content = new StringBuilder(); 6. ///儲存讀取的內容 7. ///如果過濾器(filter)為空白,則預設讀取所有檔案的內容 8. if(string.IsNullOrEmpty(filter) == true) 9. { 10. ReaderSubDirectory(path,filter,ref content); 11. } 12. else 13. { ///如果過濾器(filter)不為空白,則擷取被讀取的檔案 14. string[] filters = filter.Split(new char[] { ‘|‘ }, 15. StringSplitOptI/Ons.RemoveEmptyEntries); 16. ///讀取每一個檔案的內容 17. foreach(string fi in filters){ReaderSubDirectory(path,fi,ref 18. content);} 19. } 20. return content.ToString(); 21. }(5)在Program.cs檔案的Main(string[] args)方法中調用ReaderDirectory(string path,string filter)方法讀取"C:\data"目錄下的、尾碼名為.cs的所有檔案的內容,並顯示在控制台中。程式碼如下:1. static void Main(string[] args) 2. { ///讀取"C:\data"目錄下的所有的以",cs"結尾檔案的內容, 3. 並顯示 4. Console.WriteLine(ReaderDirectory(@"C:\data","*.cs")); 5. Console.Read(); 6. }(6)在Visual Studio 2008整合式開發環境按下F5鍵,運行Sample_21應用程式。控制台顯示的部分結果如下:1. using System; 2. using System.CollectI/Ons; 3. using System.Text; 4. using System.I/O; 5. using System.Windows.Forms; 6. 7. namespace Dorient.FileParse.Component 8. { 9. public class File 10. { 11. … 12. ///寫入檔案 13. StreamWriter writer = new StreamWriter(path,false, 14. Encoding.Default); 15. writer.Write(content); 16. writer.Close(); 17. } 18. catch(ExceptI/On ex) 19. { 20. MessageBox.Show(ex.Message,"寫入檔案錯誤"); 21. } 22. } 23. } 24. }21.5 上 機 實 踐1.代碼調試在Visual Studio 2008整合式開發環境中調試下列代碼是否能夠正常運行。如果能夠正常運行,請寫出運行結果。如果不能正常運行,請指出錯誤碼,並改正。1. namespace Test 2. { 3. class Program 4. { 5. static void Main(string[] args) 6. { 7. FileInfo fi = new FileInfo("my.ini"); 8. FileStream fsr = fi.OpenRead(); 9. byte[] datar = new byte[(int)fsr.Length]; 10. fsr.Read(datar,0,(int)fsr.Length); 11. string valuer = System.Text.Encoding.Unicode.GetString(datar); 12. Console.WriteLine(valuer); 13. Console.Read(); 14. } 15. } 16. }2.編程題在Visual Studio 2008整合式開發環境中建立名稱為FileOperation的控制台應用程式,並在該應用程式中實現對readme.txt檔案的讀寫操作。21.6 常見問題及解答問題:如何遍曆一個目錄下的所有目錄(不包括子目錄)和檔案,並顯示目錄和檔案的名稱?解答:直接使用foreach語句和Directory類中的方法即可,程式碼如下。1. string path = …///被遍曆的目錄 2. DirectoryInfo parentdi = new DirectoryInfo(path); 3. ///建立path所指定目錄的執行個體 4. foreach(DirectoryInfo di in parentdi.GetDirectories()) 5. ///訪問目前的目錄的子目錄 6. { 7. Console.WriteLine(di.Name); 8. ///顯示子目錄的名稱 9. } 10. foreach(FileInfo fi in parentdi.GetFiles()) 11. ///訪問目前的目錄的檔案 12. { 13. Console.WriteLine(fi.Name); 14. ///顯示檔案的名稱 15. }