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();
    }
}
-------------------------------------------------------------------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM