2011-04-22 24 views
0

說我有一個非常大的文件(比如說> 1GB)的中間刪除內容的快捷方式,我想在它的中間增加一個字符。是否可以在不讀寫整個文件的情況下執行此操作?我目前的解決方案是這樣的(在僞代碼):是否有添加或非常大的文件

x = 0 
chunk = read 4KB chunk x of input file 
if chunkToEdit = x, chunk = addCharacter(chunk) 
append chunk to the output file 
x = x + 1 
repeat last 4 steps until input file is fully read 
delete input file 
move output file to input file 

雖然這樣的作品,它導致的1GB讀,寫,使單個字符的變化1GB。它還需要1GB的備用磁盤空間。我寧願做的是修改文件中需要修改的部分,所以我只需要讀寫文件的一部分(即4KB的讀取和4KB的寫入)。這是可能的(或解決方案比我的更好)?

我想了一個解決方案可以由OS分段文件,並正在爲改變部分新片段是可能的,但我不知道,如果這種能力已被寫入並暴露給開發者。

回答

1

號文件不起作用這樣。如果你需要改變文件的大小,那麼你需要從修改點到最後操作。

除非你使用,可以乾淨利落地處理插入/缺失的文件格式,但它聽起來像是你不是。

1

添加中間的單個字符必然需要將該一個字符之後的所有內容都移動一個字符。這必然要求您讀取和寫入從插入點到文件末尾的所有內容。使用盡可能少的內存可以這樣做的一種方式是:

  • I = 0
  • 最後閱讀(ñ字節* I)文件的
  • 寫回文件由1個字符移
  • 我+ +
  • 重複直到到達插入點
  • 寫單個字符

換句話說:在Ñ字節的塊由一個字符從端部通過該文件以插入點倒退開始移位的一切,然後插入的字符。在你想插入角色的文件後面,這個速度會越快。如果您經常想要在文件的開頭附近插入,這可能不是最佳解決方案。