2011-12-13 71 views
0

什麼是最好的和最快速的方法在C#中從二進制文件中刪除項目。 我有一個二進制文件,我知道我需要從位置A,B的字節數中刪除字節,該怎麼做? 謝謝從二進制文件中刪除項目

+8

讀取第一個A字節,將它們複製到臨時文件中,跳過B字節,然後繼續將其餘文件複製到臨時文件中。完成後,將其移到原始頂部。完成。 –

回答

0

您可能需要考慮批量工作以防止在LOH上分配,但這取決於文件的大小以及您調用此邏輯的頻率。

 long skipIndex = 100; 
     int skipLength = 40; 

     using (FileStream fileStream = File.Open("file.dat", FileMode.Open)) 
     { 
      int bufferSize; 
      checked 
      { 
       bufferSize = (int)(fileStream.Length - (skipLength + skipIndex)); 
      } 
      byte[] buffer = new byte[bufferSize]; 

      // read all data after 
      fileStream.Position = skipIndex + skipLength; 
      fileStream.Read(buffer, 0, bufferSize); 

      // write to displacement 
      fileStream.Position = skipIndex; 
      fileStream.Write(buffer, 0, bufferSize); 
      fileStream.SetLength(fileStream.Position); // trim the file 
     } 
0

取決於...根據您的要求,有幾種方法可以做到這一點。

基本的解決方案是將源文件中的數據塊讀入目標文件,跳過必須刪除的位(是否總是隻有一個要刪除的段或多個段?)。完成後,刪除原始文件並將臨時文件重命名爲原始文件的名稱。

在這裏要記住的是,你應該傾向於更大塊而不是更小。文件的大小將決定一個合適的值。 1MB是一個很好的'默認'。

簡單的方法假定刪除和重命名新文件不成問題。如果您具有附加到文件的特定權限,或者使用了NTFS流或某些方式,則此方法無效。

在這種情況下,請複製原始文件。然後,跳到複製文件中忽略段之後的第一個字節,跳到源文件中段的起始位置,然後將字節從副本傳輸到原始位置。如果您正在使用Streams,則需要調用Stream.SetLength以將原始截斷大小改爲正確大小

+1

在原始文件中移動大塊數據時出現什麼問題? – Polity

0

如果您只想重寫原始文件並從中刪除序列,最好的方法是「重新排列「文件。
的理念是:

for i = A+1 to file.length - B 
    file[i] = file[i+B] 

爲了獲得更好的性能,最好讀取和寫入的塊,而不是單個字節。使用不同的塊大小進行測試,以查看最適合您的目標系統的內容。