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();
    }
}
-------------------------------------------------------------------------------------------------------------------------------
相關文章
相關標籤/搜索