iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Software Development

C# 學習之路系列 第 16

[DAY15] C#基礎與實作(進階-檔案處理)

  • 分享至 

  • xImage
  •  

C# 程式基礎

進階-檔案處理:

在 C# 中,檔案處理需引入`using System.IO`

讀取和寫入二進位檔案:

  使用 BinaryReaderBinaryWriter 來讀取和寫入二進位檔案

  • BinaryReader:

    • public BinaryReader (System.IO.Stream input);
    • input: 輸入資料流。
  • BinaryWriter:

    • public BinaryWriter (System.IO.Stream output);
    • output: 輸出資料流。
  • 程式範例:

    string filePath = "D:\\binary.dat";
    
    try
    {
        // 寫入二進位檔案
        using (BinaryWriter writer = 
            new BinaryWriter(File.Open(filePath, FileMode.Create)))
        {
            writer.Write(42);
            writer.Write("Hello, Binary!");
        }
    
        // 讀取二進位檔案
        using (BinaryReader reader = 
            new BinaryReader(File.Open(filePath, FileMode.Open)))
        {
            int number = reader.ReadInt32();
            string text = reader.ReadString();
            Console.WriteLine($"Number: {number}, Text: {text}");
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("處理檔案時出錯:" + e.Message);
    }
    

  https://ithelp.ithome.com.tw/upload/images/20230928/20163217e4OuAeApff.png

使用 FileStream 進行檔案操作:

  • public FileStream (string path, System.IO.FileMode mode, System.IO.FileAccess access);

    • 用途: 使用指定路徑、建立模式和讀取/寫入權限,初始化 FileStream 類別的新執行個體。
    • path: 檔案的相對或絕對路徑。
    • mode: FileMode,決定如何開啟或建立檔案。
    • access: FileAccess,決定存取檔案的方式。
  • 程式範例:

    string filePath = "D:\\advanced.txt";
    
    try
    {
        // 使用 FileStream 進行檔案操作
        using (FileStream fs =
            new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            // 在檔案末尾寫入資料
            fs.Seek(0, SeekOrigin.End);
            byte[] data = 
                System.Text.Encoding.UTF8.GetBytes("這是進階檔案操作。");
            fs.Write(data, 0, data.Length);
    
            // 讀取檔案
            fs.Seek(0, SeekOrigin.Begin);
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            string text = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine(text);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("處理檔案時出錯:" + e.Message);
    }
    

  https://ithelp.ithome.com.tw/upload/images/20230928/20163217TgBNvgp6fZ.png

  • 壓縮和解壓縮檔案:
    需引用 System.IO.Compression 來進行檔案的壓縮和解壓縮操作。
    • 程式範例(壓縮檔案):

      string sourceFilePath = "D:\\advanced.txt";
      string compressedFilePath = "D:\\compressedFile.gz";
      
      try
      {
          // 壓縮檔案
          using (FileStream sourceStream = 
              new FileStream(sourceFilePath, FileMode.Open))
          {
              using (FileStream compressedStream = 
                  File.Create(compressedFilePath))
              {
                  using (GZipStream compressionStream = 
                      new GZipStream(compressedStream, CompressionMode.Compress))
                  {
                      sourceStream.CopyTo(compressionStream);
                  }
              }
          }
      }
      catch (Exception e)
      {
          Console.WriteLine("處理檔案時出錯:" + e.Message);
      }
      

      https://ithelp.ithome.com.tw/upload/images/20230928/20163217PwuLflmLyh.png

    • 程式範例(解壓縮並建新檔案):

      string compressedFilePath = "D:\\compressedFile.gz";
      try
      {
          // 解壓縮檔案
          string decompressedFilePath = "D:\\decompressedFile.txt";
          using (FileStream compressedStream = 
              new FileStream(compressedFilePath, FileMode.Open))
          {
              using (FileStream decompressedStream = 
                  File.Create(decompressedFilePath))
              {
                  using (GZipStream decompressionStream = 
                      new GZipStream(compressedStream, CompressionMode.Decompress))
                  {
                      decompressionStream.CopyTo(decompressedStream);
                  }
              }
          }
      }
      catch (Exception e)
      {
          Console.WriteLine("處理檔案時出錯:" + e.Message);
      }
      

      https://ithelp.ithome.com.tw/upload/images/20230928/20163217QngmqOIrEY.png

程式實作練習:

  • 題目:

    • 步驟1:要創建一個二進位檔案(例如 "binary.dat"),並將「15鐵人競賽加油啊!!!」寫入其中,完成後輸出"已成功創建並寫入二進位檔案。"。
    • 步驟2:使用 FileStream 讀取二進位檔案的內容(預期讀到Number: 15, Text: 鐵人競賽加油啊!!!。)
    • 步驟3:壓縮二進位檔案並保存為壓縮檔案("compressedFile.gz"),成功後輸出"已成功壓縮檔案並保存為壓縮檔案。"。
    • 步驟4:解壓縮這個壓縮檔案讀取解壓縮後的內容(預期讀到 解壓縮後的數據 - Number: 15, Text: 鐵人競賽加油啊!!!。),並建立一個新檔案("decompressedFile.dat"),完成後輸出"已成功解壓縮檔案並讀取數據。"。
  • 程式實作:

    // 步驟1:創建二進位檔案並寫入數據
    void WriteBinaryData(string filePath)
    {
        try
        {
            using (BinaryWriter writer = 
                new BinaryWriter(File.Open(filePath, FileMode.Create)))
            {
                // 寫入數據
                writer.Write(15);
                writer.Write("鐵人競賽加油啊!!!。");
            }
    
            Console.WriteLine("已成功創建並寫入二進位檔案。");
        }
        catch (Exception e)
        {
            Console.WriteLine("處理檔案時出錯:" + e.Message);
        }
    }
    
    // 步驟2:使用 FileStream 讀取二進位檔案的內容
    void ReadBinaryData(string filePath)
    {
        try
        {
            using (FileStream fs = 
                new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                // 讀取二進位數據
                using (BinaryReader reader = new BinaryReader(fs))
                {
                    // 讀取整數
                    int number = reader.ReadInt32();
    
                    // 讀取字串
                    string text = reader.ReadString();
    
                    Console.WriteLine($"Number: {number}, Text: {text}");
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("處理檔案時出錯:" + e.Message);
        }
    }
    
    // 步驟3:壓縮二進位檔案並保存為壓縮檔案
    void CompressFile(string sourceFilePath, string compressedFilePath)
    {
        try
        {
            using (FileStream sourceStream = 
                new FileStream(sourceFilePath, FileMode.Open))
            {
                using (FileStream compressedStream = 
                    File.Create(compressedFilePath))
                {
                    using (GZipStream compressionStream = 
                        new GZipStream(compressedStream, CompressionMode.Compress))
                    {
                        sourceStream.CopyTo(compressionStream);
                    }
                }
            }
    
            Console.WriteLine("已成功壓縮檔案並保存為壓縮檔案。");
        }
        catch (Exception e)
        {
            Console.WriteLine("處理檔案時出錯:" + e.Message);
        }
    }
    
    // 步驟4:解壓縮壓縮檔案並讀取解壓縮後的內容
    void DecompressFile(string compressedFilePath)
    {
        try
        {
            // 解壓縮檔案
            string decompressedFilePath = "D:\\decompressedFile.dat";
            using (FileStream compressedStream = 
                new FileStream(compressedFilePath, FileMode.Open))
            {
                using (FileStream decompressedStream = 
                    File.Create(decompressedFilePath))
                {
                    using (GZipStream decompressionStream = 
                        new GZipStream(compressedStream, CompressionMode.Decompress))
                    {
                        decompressionStream.CopyTo(decompressedStream);
                    }
                }
            }
    
            // 讀取解壓縮後的內容
            using (BinaryReader reader = 
                new BinaryReader(File.Open(decompressedFilePath, FileMode.Open)))
            {
                int number = reader.ReadInt32();
                string text = reader.ReadString();
                Console.WriteLine($"解壓縮後的數據 - Number: {number}, Text: {text}");
            }
    
            Console.WriteLine("已成功解壓縮檔案並讀取數據。");
        }
        catch (Exception e)
        {
            Console.WriteLine("處理檔案時出錯:" + e.Message);
        }
    }
    
    // 步驟1:創建一個二進位檔案並寫入數據
    string binaryFilePath = "D:\\binary.dat";
    WriteBinaryData(binaryFilePath);
    
    // 步驟2:使用 FileStream 讀取二進位檔案的內容
    ReadBinaryData(binaryFilePath);
    
    // 步驟3:壓縮二進位檔案並保存為壓縮檔案
    string compressedFilePath = "D:\\compressedFile.gz";
    CompressFile(binaryFilePath, compressedFilePath);
    
    // 步驟4:解壓縮壓縮檔案並讀取解壓縮後的內容
    DecompressFile(compressedFilePath);
    Console.ReadKey();
    

  https://ithelp.ithome.com.tw/upload/images/20230928/20163217u7ZHrMtYn9.png
  以上的解法不是最好的,但可以依照上方的方法學習、練習,
 並期望自己找到更好的方法,持續進步><

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#
  4. microsoft BinaryReader
  5. microsoft BinaryWriter

期望挑戰30天持續更新成功 ~ DAY15


上一篇
[DAY14] C#基礎與實作(簡易-檔案處理)
下一篇
[DAY16] C#基礎與實作(異步程式設計)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言