本筆記摘抄自:https://www.cnblogs.com/liyangLife/p/4797583.html,記錄一下學習過程以備後續查用。 一、文件系統 1.1文件系統類的介紹 文件操作類大都在System.IO命名空間里,FileSystemInfo類是所有文件系統類的基類。FileInfo ...
本筆記摘抄自:https://www.cnblogs.com/liyangLife/p/4797583.html,記錄一下學習過程以備後續查用。
一、文件系統
1.1文件系統類的介紹
文件操作類大都在System.IO命名空間里,FileSystemInfo類是所有文件系統類的基類。FileInfo與File表示文件系統中的文件,DirectoryInfo與Directory
表示文件系統中的文件夾,Path表示文件系統中的路徑,DriveInfo提供對有關驅動器信息的訪問。
註意,XXXInfo與XXX類的區別是:XXX是靜態類,XXXInfo類可以實例化。還有個較為特殊的類System.MarshalByRefObject允許在支持遠程處理的
應用程式中跨應用程式域邊界訪問對象。
1.2FileInfo與File類
class Program { static void Main(string[] args) { #region FileInfo與File類 //創建文件 FileInfo file = new FileInfo(@"E:\學習筆記\C#\Test.txt"); FileStream fs = file.Create(); //關閉文件流,這個很重要。 fs.Close(); 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(); #endregion } }View Code
運行結果如下:
1.3DirectoryInfo與Directory類
class Program { static void Main(string[] args) { #region FileInfo與File類 ////創建文件 //FileInfo file = new FileInfo(@"E:\學習筆記\C#\Test.txt"); //FileStream fs = file.Create(); ////關閉文件流,這個很重要。 //fs.Close(); //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(); #endregion #region DirectoryInfo與Directory類 //創建文件夾 DirectoryInfo directory = new DirectoryInfo(@"E:\學習筆記\C#\Test"); directory.Create(); Console.WriteLine("父文件夾:" + directory.Parent.FullName); //輸出父目錄下的所有文件夾與文件 FileSystemInfo[] infos = directory.Parent.GetFileSystemInfos(); foreach (FileSystemInfo info in infos) { Console.WriteLine(info.Name); } //刪除文件夾 Directory.Delete(directory.FullName); Console.WriteLine("文件夾創建並操作完成。"); Console.Read(); #endregion } }View Code
運行結果如下:
1.4Path類
class Program { static void Main(string[] args) { #region Path類 //連接 Console.WriteLine(Path.Combine(@"E:\學習筆記\C#", @"Test.txt")); Console.WriteLine("平臺特定的字元:" + Path.DirectorySeparatorChar); Console.WriteLine("平臺特定的替換字元:" + Path.AltDirectorySeparatorChar); Console.Read(); #endregion } }View Code
運行結果如下:
1.5DriveInfo類
class Program { static void Main(string[] args) { #region DriveInfo類 DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { if (drive.IsReady) { Console.WriteLine("驅動器名稱:" + drive.Name); Console.WriteLine("驅動器類型:" + drive.DriveFormat); Console.WriteLine("總容量:" + drive.TotalFreeSpace); Console.WriteLine("可用容量:" + drive.AvailableFreeSpace + "\n"); } } Console.Read(); #endregion } }View Code
運行結果如下:
二、文件操作
2.1文件的移動、複製、刪除
class Program { static void Main(string[] args) { #region 文件的移動、複製、刪除 string path = @"E:\學習筆記\Test.txt"; File.WriteAllText(path, "測試數據"); Console.WriteLine("文件已寫入。"); File.Move(path, @"E:\學習筆記\C#\Test.txt"); Console.WriteLine("文件已移動。"); File.Copy(@"E:\學習筆記\C#\Test.txt", path); Console.WriteLine("文件已複製。"); File.Delete(@"E:\學習筆記\C#\Test.txt"); Console.WriteLine("文件已刪除。"); Console.Read(); #endregion } }View Code
2.2判斷路徑是文件還是文件夾
class Program { static void Main(string[] args) { #region 判斷路徑是文件還是文件夾 IsFile(@"E:\學習筆記\Test.txt"); IsFile(@"E:\學習筆記\"); IsFile(@"E:\學習筆記\XXX"); Console.Read(); #endregion } /// <summary> /// 判斷路徑是文件還是文件夾 /// </summary> /// <param name="path"></param> static void IsFile(string path) { if (File.Exists(path)) { Console.WriteLine("這是個文件。"); } else if (Directory.Exists(path)) { Console.WriteLine("這是個文件夾。"); } else { Console.WriteLine("路徑不存在。"); } } }View Code
運行結果如下:
三、文件讀寫與數據流
3.1文件讀取
class Program { static void Main(string[] args) { #region 文件讀取 string path = @"E:\學習筆記\Test.txt"; byte[] bytes = File.ReadAllBytes(path); Console.WriteLine("ReadAllBytes讀二進位:"); foreach (byte b in bytes) { Console.Write((char)b); } Console.WriteLine(Environment.NewLine); string[] strs = File.ReadAllLines(path, Encoding.UTF8); Console.WriteLine("ReadAllLines讀所有行:"); foreach (string s in strs) { Console.WriteLine(s + "\n"); } string str = File.ReadAllText(path, Encoding.UTF8); Console.WriteLine("ReadAllText讀所有行:\n" + str); Console.Read(); #endregion } }View Code
運行結果如下:
3.2文件寫入
class Program { static void Main(string[] args) { #region 文件寫入 string path = @"E:\學習筆記\Test.txt"; File.WriteAllBytes(path, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }); //寫入二進位 Console.WriteLine("WriteAllBytes寫入二進位成功。"); string[] array = { "123", "456", "789" }; File.WriteAllLines(path, array, Encoding.UTF8); //寫入所有行 Console.WriteLine("WriteAllLines寫入所有行成功。"); File.WriteAllText(path, "Hello World", Encoding.UTF8); //寫入字元串 Console.WriteLine("WriteAllText寫入字元串成功。\n"); Console.Read(); #endregion } }View Code
3.3數據流
FileStream:文件流,可以讀寫二進位文件。
StreamReader:流讀取器,使其以一種特定的編碼從位元組流中讀取字元。
StreamWriter:流寫入器,使其以一種特定的編碼向流中寫入字元。
BufferedStream:緩衝流,給另一流上的讀寫操作添加一個緩衝層。
3.3.1使用FileStream讀寫二進位文件
class Program { static void Main(string[] args) { #region 使用FileStream讀寫二進位文件 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("寫入數據成功!!!"); //以讀文件的方式打開文件 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(); #endregion } }View Code
運行結果如下:
3.3.2StreamWriter與StreamReader
使用StreamWriterStreamReader就不用擔心文本文件的編碼方式,所以它們很適合讀寫文本文件。
class Program { static void Main(string[] args) { #region StreamWriter與StreamReader string path = @"E:\學習筆記\C#\Test1.txt"; //以寫文件的方式創建文件 FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(file); sw.WriteLine("科比·布萊恩特"); sw.Dispose(); Console.WriteLine("寫入數據成功!!!"); //以讀文件的方式打開文件 file = new FileStream(path, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(file); Console.WriteLine("讀取數據:" + sr.ReadToEnd()); sr.Dispose(); Console.Read(); #endregion } }View Code
運行結果如下:
四、記憶體映射文件
MemoryMappedFile類(.NET4新增):
應用程式需要頻繁地或隨機地訪問文件時,最好使用MemoryMappedFile類(映射記憶體的文件)。使用這種方式允許把文件的一部分或者全部載入到一段
虛擬記憶體上,這些文件內容會顯示給應用程式,就好像這個文件包含在應用程式的主記憶體中一樣。
class Program { static void Main(string[] args) { #region 記憶體映射文件 MemoryMappedFile mmFile = MemoryMappedFile.CreateFromFile(@"E:\學習筆記\C#\Test2.txt", FileMode.OpenOrCreate, "MapName", 1024 * 1024); //記憶體映射文件的視圖 //或使用數據流操作記憶體文件MemoryMappedViewStream stream = mmFile.CreateViewStream(); MemoryMappedViewAccessor mmViewAccessor = mmFile.CreateViewAccessor(); string str = "科比·布萊恩特"; int length = Encoding.UTF8.GetByteCount(str); //寫入數據 mmViewAccessor.WriteArray<byte>(0, Encoding.UTF8.GetBytes(str), 0, length); byte[] bytes = new byte[length]; mmViewAccessor.ReadArray<byte>(0, bytes, 0, bytes.Length); Console.WriteLine(Encoding.UTF8.GetString(bytes)); //釋放資源 mmFile.Dispose(); Console.Read(); #endregion } }View Code
運行結果如下:
五、文件安全
5.1ACL介紹
ACL是存在於電腦中的一張表(訪問控製表),它使操作系統明白每個用戶對特定系統對象--例如文件目錄或單個文件的存取許可權,每個對象擁有一個在
訪問控製表中定義的安全屬性。每個系統用戶對於這張表擁有一個訪問許可權,最一般的訪問許可權包括讀文件(包括所有目錄中的文件)、寫一個或多個文件
和執行一個文件(如果它是一個可執行文件或者是程式的時候)。
5.2讀取文件的ACL
class Program { static void Main(string[] args) { #region 讀取文件的ACL 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(); #endregion } }View Code
運行結果如下:
5.3讀取文件夾的ACL
class Program { static void Main(string[] args) { #region 讀取文件夾的ACL 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(); #endregion } }View Code
運行結果如下:
5.4修改ACL
class Program { static void Main(string[] args) { #region 修改ACL FileStream file = new FileStream(@"E:\學習筆記\Test.txt", FileMode.Open, FileAccess.Read); //得到文件訪問控制屬性 FileSecurity filesec = file.GetAccessControl(); //輸出文件訪問控制項 PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount))); FileSystemAccessRule rule = new FileSystemAccessRule ( new NTAccount(@"AtomyStudio\Administrator"), //電腦賬戶名 FileSystemRights.Delete, //操作許可權 AccessControlType.Allow //能否訪問受保護的對象 ); filesec.AddAccessRule(rule); //增加ACL項 PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount))); //輸出文件訪問控制項 filesec.RemoveAccessRule(rule); //移除ACL項 PrintACL(filesec.GetAccessRules(true, true, typeof(NTAccount))); //輸出文件訪問控制項 file.Dispose(); Console.Read(); #endregion } }View Code
運行結果如下:
六、讀寫註冊表
6.1註冊表介紹
Windows註冊表是幫助Windows控制硬體、軟體、用戶環境和Windows界面的一套數據文件,運行regedit可以看到有5個註冊表配置單元(實際有7個):
HKEY-CLASSES-ROOT: 文件關聯和COM信息
HKEY-CURRENT-USER: 用戶輪廓
HKEY-LOCAL-MACHINE: 本地機器系統全局配置子鍵
HKEY-USERS: 已載入用戶輪廓子鍵
HKEY-CURRENT-CONFIG: 當前硬體配置
6.2.NET操作註冊表的類
在.NET中提供了Registry類、RegistryKey類來實現對註冊表的操作。
6.2.1Registry類
封裝了註冊表的七個基本主鍵:
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主鍵
6.2.2RegistryKey類
封裝了對註冊表的基本操作,包括讀取、寫入,刪除。
1)讀取的函數:
OpenSubKey() 主要是打開指定的子鍵
GetSubKeyNames() 獲得主鍵下麵的所有子鍵的名稱,它的返回值是一個字元串數組。
GetValueNames() 獲得當前子鍵中的所有的鍵名稱,它的返回值也是一個字元串數組。
GetValue() 指定鍵的鍵值。
2)寫入的函數:
CreateSubKey() 增加一個子鍵
SetValue() 設置一個鍵的鍵值
3)刪除的函數:
DeleteSubKey() 刪除一個指定的子鍵
DeleteSubKeyTree() 刪除該子鍵以及該子鍵以下的全部子鍵
6.3示例
class Program { static void Main(string[] args) { #region 讀寫註冊表 string path = @"SOFTWARE\Microsoft\Internet Explorer\Extension Compatibility"; //以只讀方式 RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(path, true); if (registryKey != null) { Console.WriteLine(registryKey.Name + "--" + registryKey.SubKeyCount + "--" + registryKey.ValueCount); string subRegistryKey = Guid.NewGuid().ToString(); //增加一個子鍵 registryKey.CreateSubKey(subRegistryKey); RegistryKey newRegistryKey = Registry.LocalMachine.OpenSubKey(path + @"\" + subRegistryKey, true); //設置一個鍵的鍵值 newRegistryKey.SetValue("姓名", "科比"); //設置一個鍵的鍵值 newRegistryKey.SetValue("鍵名", "布萊恩特"); Console.WriteLine(registryKey.Name + "--" + registryKey.SubKeyCount + "--" + registryKey.ValueCount); registryKey.Close(); newRegistryKey.Close(); } Console.Read(); #endregion } }View Code
運行結果生成值為:
七、讀寫獨立的存儲器
7.1IsolatedStorageFile類
使用IsolatedStorageFile類可以讀寫獨立的存儲器。
獨立的存儲器可以看成一個虛擬磁碟,在其中可以保存只由創建他們的應用程式或其應用程式實例共用的數據項。
獨立的存儲器的訪問類型有兩種:第一種是一個應用程式的多個實例在同一個獨立存儲器中工作,第二種是一個應用程式的多個實例在各自不同的獨立存
儲器中工作。
7.2示例
class Program { static void Main(string[] args) { #region 讀寫獨立的存儲器 //寫文件 IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(@"Test.txt", FileMode.Create, FileAccess.Write); string str = "科比·布萊恩特"; byte[] bytes = Encoding.UTF8.GetBytes(str); //寫數據 fileStream.Write(bytes, 0, bytes.Length); fileStream.Dispose(); //讀文件 IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForDomain(); string[] fileNames = file.GetFileNames(@"Test.txt"); foreach (string fileName in fileNames) { Console.WriteLine(fileName); fileStream = new IsolatedStorageFileStream(fileName, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fileStream); Console.WriteLine("讀取文件:" + sr.ReadToEnd()); sr.Dispose(); //刪除文件 file.DeleteFile(fileName); } file.Dispose(); Console.WriteLine("OK!"); Console.Read(); #endregion } }View Code
運行結果如下: