本筆記摘抄自:http://www.javashuo.com/article/p-oqduchud-dy.html,記錄一下學習過程以備後續查用。html
1、文件系統數組
1.1文件系統類的介紹安全
文件操做類大都在System.IO命名空間裏,FileSystemInfo類是全部文件系統類的基類。FileInfo與File表示文件系統中的文件,DirectoryInfo與Directoryapp
表示文件系統中的文件夾,Path表示文件系統中的路徑,DriveInfo提供對有關驅動器信息的訪問。ide
注意,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 } }
運行結果以下:ui
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 } }
運行結果以下:
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 } }
運行結果以下:
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 } }
運行結果以下:
2、文件操做
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 } }
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("路徑不存在。"); } } }
運行結果以下:
3、文件讀寫與數據流
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 } }
運行結果以下:
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 } }
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 } }
運行結果以下:
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 } }
運行結果以下:
4、內存映射文件
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 } }
運行結果以下:
5、文件安全
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 } }
運行結果以下:
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 } }
運行結果以下:
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 } }
運行結果以下:
6、讀寫註冊表
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 } }
運行結果生成值爲:
7、讀寫獨立的存儲器
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 } }
運行結果以下: