C# 檔案IO常用類

綠龍術士發表於2018-03-20

FileFileInfo類可以讀取,寫入,建立,刪除,移動檔案

· C# 4.0之前ReadAllLines()方法用於讀取檔案中所有的行,並以陣列的形式返回,但是它有一個問題,就是它要等所有的行寫入記憶體之後才能讀取第一行內容。

· ReadLines()方法解決了這個問題,它返回IEnumerable<string>而不是string陣列,這個新增的方法要高效很多,它不是將所有行一次性載入進記憶體中,而是每次讀取一行。

            var path = Path.Combine(@"D:\迅雷下載", "ReadMe.txt");
            //不推薦使用
            var files = File.ReadAllLines(path);
            foreach (var item in files)
            {
                Console.WriteLine(item);
            }


            //推薦使用
            var files2 = File.ReadLines(path);
            foreach (var item in files2)
            {
                Console.WriteLine(item);
            }

· 如果要開啟一個很大的檔案,之前的方法要等整個檔案都加入記憶體中,才能訪問第一行。而這個新方法每次只讀取一行,更加高效。

· Path類可以讀取檔案或目錄的資訊如:副檔名,檔案,資料夾名,返回隨機檔案,建立臨時檔案等。

            var fileName = @"D:\資料庫檔案\資料庫.txt";
            var ext = Path.GetExtension(fileName);
            var dir = Path.GetDirectoryName(fileName);
            var file =  Path.GetFileName(fileName);
            var fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);
            var rootName = Path.GetPathRoot(fileName);
            var randomFile = Path.GetRandomFileName();
            var fullName = Path.GetFullPath(randomFile);
            var tempName = Path.GetTempFileName();
            var tempPath = Path.GetTempPath();
            var tempNameAfter = Path.ChangeExtension(tempName, "txt");
            Console.WriteLine($"目錄名稱:{ dir },擴充名:{ext},檔名:{file},沒有擴充名的檔名:{fileWithoutExt}");
            Console.WriteLine($"根目錄名稱:{rootName},隨機檔名:{randomFile},隨機檔案路徑:{fullName},臨時檔案:{tempName}");
            Console.WriteLine($"臨時資料夾路徑:{tempPath},修改後的臨時檔案:{tempNameAfter}");

· 流是一個用於傳輸資料的物件,資料可以向兩個方向傳輸:

· 外部源 --> 程式 (讀取流)

· 程式 -->  外部源 (寫入流)

· 外部源可能是一些網路協議(介面),命名管道,記憶體區域

· 我們可以使用System.IO,MemoryStream物件讀寫記憶體

· System.Net.Sockets.NetworkStream物件處理網路資料

· Stream類對外部資料來源不做任何假定,外部資料來源可以是檔案流,記憶體流,網路流或任意資料來源。

· 一些流可以連結呼叫(chain),可以先使用DeflateStream壓縮資料,然後寫入到FileStream,MemoryStreamNetworkStream中。

· 直接讀寫流不是那麼容易,但是可以使用閱讀器和寫入器,流入StringReaderStringWriter類。這是一個關注點分離。

使用FileStream類讀寫文字檔案,需要使用位元組陣列。有更簡單的方法:使用讀取器(StreamReader)和寫入器(StreamWriter),使用它們無需處理位元組陣列和編碼,比較輕鬆。

使用FileStream讀取檔案的例子:

            var path = Path.Combine(@"D:\迅雷下載", "ReadMe.txt");
            using (FileStream stream = new FileStream(path,FileMode.OpenOrCreate))
            {
                byte[] b = new byte[stream.Length];
                var r = stream.Read(b, 0, (int)stream.Length);
                var s = Encoding.UTF8.GetString(b);
                Console.WriteLine(s);
                
            }

使用StreamReader讀取檔案的例子:

            string path = @"D:\迅雷下載\ReadMe.txt";
            goto s1;
            s1:
            //StreamReader可以使用EndOfStream檢查是否在檔案末尾,使用ReadLine()讀取文字行
            using (var stream = new StreamReader(path))
            {
                while(!stream.EndOfStream)
                {
                    string line = stream.ReadLine();
                    Console.WriteLine(line);
                }
            }
            s2:
            //還可以使用File類的OpenText方法建立StreamReader,並且StreamReader還可以呼叫ReadToEnd()方法讀取完整的檔案。
            using (var stream = File.OpenText(path))
            {
                var content = stream.ReadToEnd();
                Console.WriteLine(content);
            }

相關文章