簡體   English   中英

C# - 刪除大型二進制文件中的字節塊

[英]C# - remove blocks of bytes in large binary files

我想要一種在 C# 中的快速方法從大小在 500MB 到 1GB 之間的二進制文件中刪除不同位置的字節塊,需要刪除的字節的開始和長度在保存的數組中

int[] rdiDataOffset= {511,15423,21047};
int[] rdiDataSize={102400,7168,512};

編輯:這是我的一段代碼,除非我將緩沖區大小設置為 1,否則它將無法正常工作:

while(true){
    if (rdiDataOffset.Contains((int)fsr.Position))
    {
        int idxval = Array.IndexOf(rdiDataOffset, (int)fsr.Position, 0, rdiDataOffset.Length);
        int oldRFSRPosition = (int)fsr.Position;
        size = rdiDataSize[idxval];
        fsr.Seek(size, SeekOrigin.Current);

    }
    int bufferSize = size == 0 ? 2048 : size;
    if ((size>0) && (bufferSize > (size))) bufferSize = (size);
    if (bufferSize > (fsr.Length - fsr.Position)) bufferSize = (int)(fsr.Length - fsr.Position);
    byte[] buffer = new byte[bufferSize];
    int nofbytes = fsr.Read(buffer, 0, buffer.Length);
    fsr.Flush();
    if (nofbytes < 1)
    {
     break;
    }
   }

沒有通用的文​​件系統提供從現有文件中間刪除塊的有效方法(僅從末尾截斷)。 刪除后,您必須將所有數據復制回適當的新位置。

使用臨時文件執行此操作的簡單算法(也可以就地完成,但萬一出現問題,情況會更加危險)。

  1. 創建一個新文件並調用SetLength來設置流大小(如果這太慢,您可以互操作到SetFileValidData )。 這可確保您在復制時為臨時文件留出空間。

  2. 按升序對刪除列表進行排序。

  3. 從當前位置(從 0 開始)讀取到第一個移除點。 源文件應該在沒有授予寫入共享權限的情況下打開(您不希望有人在編輯它時弄亂它)。

  4. 將該內容寫入新文件(您可能需要分塊執行此操作)。

  5. 跳過未復制的數據

  6. 從#3 重復直到完成

  7. 您現在有兩個文件 - 舊的和新的...根據需要替換。 如果這確實是關鍵數據,您可能需要查看事務方法(您實現的方法或使用類似 NTFS 事務的方法)。

  8. 考慮一個新的設計。 如果這是您需要經常做的事情,那么在文件(或文件附近)中包含一個包含非活動塊列表的索引可能更有意義 - 然后在必要時您可以通過實際刪除塊來壓縮文件.. . 或者這就是那個過程。

如果您使用的是 NTFS 文件系統(大多數 Windows 部署是)並且您不介意使用 p/invoke 方法,那么有一種方法可以更快地從文件中刪除塊。 您可以使文件稀疏 對於稀疏文件,您可以通過一次調用消除文件的一大塊。

執行此操作時,文件不會被重寫。 相反,NTFS 更新有關清零數據范圍的元數據。 稀疏文件的美妙之處在於文件的使用者不必知道文件的稀疏性。 也就是說,當您從 FileStream 讀取稀疏文件時,會透明地跳過清零的范圍。

NTFS 將此類文件用於自己的簿記。 例如,USN 日志是一個非常大的稀疏內存映射文件。

您制作文件稀疏和該文件的零部分的方法是使用 DeviceIOControl Windows API。 它是神秘的,需要 p/invoke 但如果你走這條路,你肯定會隱藏在漂亮的函數調用背后的麻煩。

有一些問題需要注意。 例如,如果將文件移動到非 ntfs 卷然后返回,文件的稀疏性可能會消失 - 因此您應該防御性地編程。

此外,稀疏文件可能看起來比實際大 - 使涉及磁盤配置的任務復雜化。 已完全清零的 5g 稀疏文件仍將 5g 計入用戶的磁盤配額。

如果稀疏文件積累了很多漏洞,您可能希望偶爾在維護窗口中重寫該文件。 我還沒有看到任何真正的性能問題發生,但我至少可以想象一個瑞士俗氣的稀疏文件的元數據可能會導致一些性能下降。

如果您有這個想法,這里有一些文檔的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM