C#常用IO流與讀寫檔案
1.檔案系統
(1)檔案系統類的介紹 檔案操作類大都在System.IO名稱空間裡。FileSystemInfo類是任何檔案系統類的基類;FileInfo與File表示檔案系統中的檔案;DirectoryInfo與Directory表示檔案系統中的資料夾;Path表示檔案系統中的路徑;DriveInfo提供對有關驅動器的資訊的訪問。注意,XXXInfo與XXX類的區別是:XXX是靜態類,XXXInfo類可以例項化。 還有個較為特殊的類System.MarshalByRefObject允許在支援遠端處理的應用程式中跨應用程式域邊界訪問物件。 (2)FileInfo與File類 class Program { static void Main(string[] args) { FileInfo file = new FileInfo(@"E:\學習筆記\C#平臺\test.txt");//建立檔案 Console.WriteLine("建立時間:" + file.CreationTime); Console.WriteLine("路徑:" + file.DirectoryName); StreamWriter sw = file.AppendText();//開啟追加流 sw.Write("李志偉");//追加資料 sw.Dispose();//釋放資源,關閉檔案 File.Move(file.FullName, @"E:\學習筆記\test.txt");//移動 Console.WriteLine("完成!"); Console.Read(); } } (3)DirectoryInfo與Directory類 class Program { static void Main(string[] args) { //建立資料夾 DirectoryInfo directory = new DirectoryInfo(@"E:\學習筆記\C#平臺\test"); directory.Create(); Console.WriteLine("父資料夾:" + directory.Parent.FullName); //輸出父目錄下的所有檔案與資料夾 FileSystemInfo[] files = directory.Parent.GetFileSystemInfos(); foreach (FileSystemInfo fs in files) { Console.WriteLine(fs.Name); } Directory.Delete(directory.FullName);//刪除資料夾 Console.WriteLine("完成!"); Console.Read(); } } (4)Path類 class Program { static void Main(string[] args) { Console.WriteLine(Path.Combine(@"E:\學習筆記\C#平臺", @"Test\Test.TXT"));//連線 Console.WriteLine("平臺特定的字元:" + Path.DirectorySeparatorChar); Console.WriteLine("平臺特定的替換字元:" + Path.AltDirectorySeparatorChar); Console.Read(); } } (5)DriveInfo類 class Program { static void Main(string[] args) { DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo d in drives) { if (d.IsReady) { Console.WriteLine("總容量:" + d.TotalFreeSpace); Console.WriteLine("可用容量:" + d.AvailableFreeSpace); Console.WriteLine("驅動器型別:" + d.DriveFormat); Console.WriteLine("驅動器的名稱:" + d.Name + "\n"); } } Console.WriteLine("OK!"); Console.Read(); } } 回到頂部 2.檔案操作
(1)移動、複製、刪除檔案 class Program { static void Main(string[] args) { string path = @"E:\學習筆記\C#平臺\Test.txt"; File.WriteAllText(path, "測試資料"); Console.WriteLine("檔案已建立,請檢視!"); Console.ReadLine(); File.Move(path, @"E:\學習筆記\Test.txt"); Console.WriteLine("移動完成,請檢視!"); Console.ReadLine(); File.Copy(@"E:\學習筆記\Test.txt", path); Console.WriteLine("檔案已複製,請檢視!"); Console.ReadLine(); File.Delete(path); File.Delete(@"E:\學習筆記\Test.txt"); Console.WriteLine("檔案已刪除,請檢視!\nOK!"); Console.Read(); } } (2)判斷是檔案還是資料夾 class Program { static void Main(string[] args) { IsFile(@"E:\學習筆記\C#平臺\Test.txt"); IsFile(@"E:\學習筆記\"); IsFile(@"E:\學習筆記\XXXXXXX"); Console.Read(); } //判斷路徑是否是檔案或資料夾 static void IsFile(string path) { if (Directory.Exists(path)) { Console.WriteLine("是資料夾!"); } else if (File.Exists(path)) { Console.WriteLine("是檔案!"); } else { Console.WriteLine("路徑不存在!"); } } } 回到頂部 3.讀寫檔案與資料流
(1)讀檔案 class Program { static void Main(string[] args) { string path = @"E:\學習筆記\C#平臺\Test.txt"; byte[] b = File.ReadAllBytes(path); Console.WriteLine("ReadAllBytes讀二進位制:"); foreach (byte temp in b) { Console.Write((char)temp+" "); } string[] s = File.ReadAllLines(path, Encoding.UTF8); Console.WriteLine("\nReadAllLines讀所有行:"); foreach (string temp in s) { Console.WriteLine("行:"+temp); } string str = File.ReadAllText(path, Encoding.UTF8); Console.WriteLine("ReadAllText讀所有行:\n" + str); Console.Read(); } } (2)寫檔案 class Program { static void Main(string[] args) { string path = @"E:\學習筆記\C#平臺\Test.txt"; File.WriteAllBytes(path,new byte[] {0,1,2,3,4,5,6,7,8,9});//寫入二進位制 Console.WriteLine("WriteAllBytes寫入二進位制成功"); Console.ReadLine(); string[] array = {"123","456","7890"}; File.WriteAllLines(path, array, Encoding.UTF8);//寫入所有行 Console.WriteLine("WriteAllLines寫入所有行成功"); Console.ReadLine(); File.WriteAllText(path, "abcbefghijklmn",Encoding.UTF8);//寫入字串 Console.WriteLine("WriteAllText寫入字串成功\nOK!"); Console.Read(); } } (3)資料流 最常用的流類如下: FileStream: 檔案流,可以讀寫二進位制檔案。 StreamReader: 流讀取器,使其以一種特定的編碼從位元組流中讀取字元。 StreamWriter: 流寫入器,使其以一種特定的編碼向流中寫入字元。 BufferedStream: 緩衝流,給另一流上的讀寫操作新增一個緩衝層。 資料流類的層次結構: (4)使用FileStream讀寫二進位制檔案 class Program { static void Main(string[] args) { string path = @"E:\學習筆記\C#平臺\Test.txt"; //以寫檔案的方式建立檔案 FileStream file = new FileStream(path, FileMode.CreateNew, FileAccess.Write); string str = "測試檔案--李志偉"; byte[] bytes = Encoding.Unicode.GetBytes(str); file.Write(bytes, 0, bytes.Length);//寫入二進位制 file.Dispose(); Console.WriteLine("寫入資料成功!!!"); Console.ReadLine(); //以讀檔案的方式開啟檔案 file = new FileStream(path, FileMode.Open, FileAccess.Read); byte[] temp = new byte[bytes.Length]; file.Read(temp, 0, temp.Length);//讀取二進位制 Console.WriteLine("讀取資料:" + Encoding.Unicode.GetString(temp)); file.Dispose(); Console.Read(); } } (5)StreamWriter與StreamReader 使用StreamWriterStreamReader就不用擔心文字檔案的編碼方式,所以它們很適合讀寫文字檔案。 class Program { static void Main(string[] args) { string path = @"E:\學習筆記\C#平臺\Test.txt"; //以寫檔案的方式建立檔案 FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(file); sw.WriteLine("測試檔案--李志偉"); sw.Dispose(); Console.WriteLine("寫入資料成功!!!"); Console.ReadLine(); //以讀檔案的方式開啟檔案 file = new FileStream(path, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(file); Console.WriteLine("讀取資料:"+sr.ReadToEnd()); sr.Dispose(); Console.Read(); } } 回到頂部 4.對映記憶體的檔案
(1)MemoryMappedFile類(.NET4新增) 應用程式需要頻繁地或隨機地訪問檔案時,最好使用MemoryMappedFile類(對映記憶體的檔案)。使用這種方式允許把檔案的一部分或者全部載入到一段虛擬記憶體上,這些檔案內容會顯示給應用程式,就好像這個檔案包含在應用程式的主記憶體中一樣。 (2)使用示例 class Program { static void Main(string[] args) { MemoryMappedFile mmfile = MemoryMappedFile.CreateFromFile(@"E:\Test.txt", FileMode.OpenOrCreate, "MapName", 1024 * 1024); MemoryMappedViewAccessor view = mmfile.CreateViewAccessor();//記憶體對映檔案的檢視 //或使用資料流操作記憶體檔案 //MemoryMappedViewStream stream = mmfile.CreateViewStream(); string str = "測試資料:李志偉!"; int length = Encoding.UTF8.GetByteCount(str); view.WriteArray<byte>(0, Encoding.UTF8.GetBytes(str), 0, length);//寫入資料 byte[] b = new byte[length]; view.ReadArray<byte>(0, b, 0, b.Length); Console.WriteLine(Encoding.UTF8.GetString(b)); mmfile.Dispose();//釋放資源 Console.Read(); } } 回到頂部 5.檔案安全
(1)ACL介紹 ACL是存在於計算機中的一張表(訪問控制表),它使作業系統明白每個使用者對特定系統物件,例如檔案目錄或單個檔案的存取許可權。每個物件擁有一個在訪問控制表中定義的安全屬性。這張表對於每個系統使用者有擁有一個訪問許可權。最一般的訪問許可權包括讀檔案(包括所有目錄中的檔案),寫一個或多個檔案和執行一個檔案(如果它是一個可執行檔案或者是程式的時候)。 (2)讀取檔案的ACL class Program { static void Main(string[] args) { FileStream file = new FileStream(@"E:\Test.txt", FileMode.Open, FileAccess.Read); FileSecurity filesec = file.GetAccessControl();//得到檔案訪問控制屬性 //輸出檔案的訪問控制項 foreach (FileSystemAccessRule filerule in filesec.GetAccessRules(true, true, typeof(NTAccount))) { Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference); } file.Dispose(); Console.Read(); } } (3)讀取資料夾的ACL class Program { static void Main(string[] args) { DirectoryInfo dir= new DirectoryInfo(@"E:\學習筆記\C#平臺"); DirectorySecurity filesec = dir.GetAccessControl();//得到檔案訪問控制屬性 //輸出檔案的訪問控制項 foreach (FileSystemAccessRule filerule in filesec.GetAccessRules(true, true, typeof(NTAccount))) { Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference); } Console.Read(); } } (4)修改ACL class Program { static void Main(string[] args) { FileStream file = new FileStream(@"E:\Test.txt", FileMode.Open, FileAccess.Read); FileSecurity filesec = file.GetAccessControl();//得到檔案訪問控制屬性 Print(filesec.GetAccessRules(true, true, typeof(NTAccount)));//輸出檔案訪問控制項 FileSystemAccessRule rule = new FileSystemAccessRule( new NTAccount(@"CENTER-YFB-512\LiZW"), //計算機賬戶名 FileSystemRights.Delete, //操作許可權 AccessControlType.Allow);//能否訪問受保護的物件 filesec.AddAccessRule(rule);//增加ACL項 Print(filesec.GetAccessRules(true, true, typeof(NTAccount)));//輸出檔案訪問控制項 filesec.RemoveAccessRule(rule);//移除ACL項 Print(filesec.GetAccessRules(true, true, typeof(NTAccount)));//輸出檔案訪問控制項 file.Dispose(); Console.Read(); } //輸出檔案訪問控制項 static void Print(AuthorizationRuleCollection rules) { foreach (FileSystemAccessRule filerule in rules) { Console.WriteLine(filerule.AccessControlType + "--" + filerule.FileSystemRights + "--" + filerule.IdentityReference); } Console.WriteLine("================================================"); } } 回到頂部 6.讀寫登錄檔
(1)登錄檔介紹 Windows登錄檔是幫助Windows控制硬體、軟體、使用者環境和Windows介面的一套資料檔案,執行regedit可以看到5個登錄檔配置單元(實際有7個): HKEY-CLASSES-ROOT: 檔案關聯和COM資訊 HKEY-CURRENT-USER: 使用者輪廓 HKEY-LOCAL-MACHINE: 本地機器系統全域性配置子鍵 HKEY-USERS: 已載入使用者輪廓子鍵 HKEY-CURRENT-CONFIG: 當前硬體配置 (2).NET操作登錄檔的類 在.NET中提供了Registry類、RegistryKey類來實現對登錄檔的操作。其中Registry類封裝了登錄檔的七個基本主健: Registry.ClassesRoot 對應於HKEY_CLASSES_ROOT主鍵 Registry.CurrentUser 對應於HKEY_CURRENT_USER主鍵 Registry.LocalMachine 對應於 HKEY_LOCAL_MACHINE主鍵 Registry.User 對應於 HKEY_USER主鍵 Registry.CurrentConfig 對應於HEKY_CURRENT_CONFIG主鍵 Registry.DynDa 對應於HKEY_DYN_DATA主鍵 Registry.PerformanceData 對應於HKEY_PERFORMANCE_DATA主鍵 RegistryKey類封裝了對登錄檔的基本操作,包括讀取,寫入,刪除。其中讀取的主要函式有: OpenSubKey() 主要是開啟指定的子鍵。 GetSubKeyNames() 獲得主鍵下面的所有子鍵的名稱,它的返回值是一個字串陣列。 GetValueNames() 獲得當前子鍵中的所有的鍵名稱,它的返回值也是一個字串陣列。 GetValue() 指定鍵的鍵值。 寫入的函式: CreateSubKey() 增加一個子鍵 SetValue() 設定一個鍵的鍵值 刪除的函式: DeleteSubKey() 刪除一個指定的子鍵。 DeleteSubKeyTree() 刪除該子鍵以及該子鍵以下的全部子鍵。 (3)示例 class Program { static void Main(string[] args) { string path = @"SOFTWARE\Microsoft\Internet Explorer\Extensions"; RegistryKey pregkey = Registry.LocalMachine.OpenSubKey(path, true);//以只讀方式 if (pregkey != null) { Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount); string preName = System.Guid.NewGuid().ToString(); pregkey.CreateSubKey(preName);//增加一個子鍵 RegistryKey new_pregkey = Registry.LocalMachine.OpenSubKey(path + @"\" + preName, true); new_pregkey.SetValue("姓名", "李志偉");//設定一個鍵的鍵值 new_pregkey.SetValue("鍵名", "值內容");//設定一個鍵的鍵值 Console.WriteLine(pregkey.Name + "--" + pregkey.SubKeyCount + "--" + pregkey.ValueCount); pregkey.Close(); new_pregkey.Close(); } Console.Read(); } } 回到頂部 7.讀寫獨立的儲存器
(1)IsolatedStorageFile類 使用IsolatedStorageFile類可以讀寫獨立的儲存器,獨立的儲存器可以看成一個虛擬磁碟,在其中可以儲存只由建立他們的應用程式或其應用程式程式例項共享的資料項。 獨立的儲存器的訪問型別有兩種(如下圖):第一種是一個應用程式的多個例項在同一個獨立儲存器中工作,第二種是一個應用程式的多個例項在各自不同的獨立儲存器中工作。
(2)示例 class Program { static void Main(string[] args) { //寫檔案 IsolatedStorageFileStream storStream = new IsolatedStorageFileStream(@"Test.txt", FileMode.Create, FileAccess.Write); string str = "測試資料:李志偉!ABCD"; byte[] bs = Encoding.UTF8.GetBytes(str); storStream.Write(bs, 0, bs.Length);//寫資料 storStream.Dispose(); //讀檔案 IsolatedStorageFile storFile = IsolatedStorageFile.GetUserStoreForDomain(); string[] files=storFile.GetFileNames(@"Test.txt"); foreach (string t in files) { Console.WriteLine(t); storStream = new IsolatedStorageFileStream(t, FileMode.Open, FileAccess.Read); StreamReader sr=new StreamReader(storStream); Console.WriteLine("讀取檔案:"+sr.ReadToEnd()); sr.Dispose(); storFile.DeleteFile(t);//刪除檔案 } storFile.Dispose(); Console.WriteLine("OK!"); Console.Read(); } } -------------------------------------------------------------------------------------------------------------------------------