首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 使用 FileStream 分段複製大檔案,節省記憶體

     編輯:關於C語言

分段複製原理

每次讀取/寫入固定大小緩衝區,避免一次性載入整個檔案導致記憶體壓力。本機複製亦可直接用 File.Copy,此處示範手動控制流程。

核心程式碼


private void CopyFile(string fromFile, string toFile, int lengthEachTime)
{
    using (var fsSrc = new FileStream(fromFile, FileMode.Open, FileAccess.Read))
    using (var fsDst = new FileStream(toFile, FileMode.Append, FileAccess.Write))
    {
        if (lengthEachTime < fsSrc.Length) // 分段複製
        {
            byte[] buffer = new byte[lengthEachTime];
            int copied = 0;
            while (copied <= fsSrc.Length - lengthEachTime)
            {
                int read = fsSrc.Read(buffer, 0, lengthEachTime);
                fsSrc.Flush();
                fsDst.Write(buffer, 0, lengthEachTime);
                fsDst.Flush();
                fsDst.Position = fsSrc.Position;
                copied += read;
            }
            // 複製剩餘部分
            int left = (int)fsSrc.Length - copied;
            fsSrc.Read(buffer, 0, left);
            fsSrc.Flush();
            fsDst.Write(buffer, 0, left);
            fsDst.Flush();
        }
        else // 整體複製
        {
            byte[] buffer = new byte[fsSrc.Length];
            fsSrc.Read(buffer, 0, (int)fsSrc.Length);
            fsSrc.Flush();
            fsDst.Write(buffer, 0, (int)fsSrc.Length);
            fsDst.Flush();
        }
    }
}

關鍵點

  • using 區塊:確保串流正確關閉釋放資源。
  • 緩衝區大小:由呼叫端指定 lengthEachTime,建議 4KB~1MB 視情況調整。
  • 位置同步:fsDst.Position = fsSrc.Position 確保讀寫位置一致。
  • Flush:強制寫入磁碟,視效能需求可選擇性移除。

此模式適用於大檔案傳輸、斷點續傳基礎、網路串流儲存等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved