2013-08-05 54 views
0

我希望能夠使用C++編輯二進制文件的內容,並將所有內容刪除至特定的字符位置,我已經知道它有點像從文件中刪除標題。從文件中刪除標題

我有一個示例文件包含130萬字節,我想刪除第一個38400,然後將文件保存爲原始名稱。

目前,我一直在做一個緩衝讀取,以找到每個文件的位置(剪切文件的位置的規則是複雜的,它不是一個簡單的搜索),當然,我可以做另一個緩衝區從pos讀取,輸出到一個新的文件,然後做一個重命名,或沿着這些線。

但它感覺非常沉重,必須複製整個文件。有沒有什麼辦法可以讓操作系統(Windows Vista &只能向上 - 不需要跨平臺)來重新定位文件的開始,並回收那些38,400字節?唉,我無法找到,因此爲什麼我會問你的幫助:)

非常感謝你提供的任何幫助。

+0

複製整個文件花費的時間太長? – willj

+0

它沒有超出我的預期,但有些文件超過2GB,因此也不是很小。無論如何,非常感謝你的幫助。非常感謝:) – niemiro

+0

我剛剛發現一些進一步的解釋,爲什麼它沒有實現:http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx – niemiro

回答

2

不,不支持在我熟悉的任何操作系統(包括任何版本的Windows)中刪除文件的頭部。您必須物理移動要保留的字節,以便在開始時結束。你可以做一些努力,但最簡單的方法就是你的建議 - 寫一個新文件,然後重命名和刪除舞蹈。

1

你在找什麼是我稱之爲「lop」操作,它有點像截斷,但在文件的前端。我回到a question about it。不幸的是,沒有這樣的東西可用。

+0

所以,你給了一個名稱,甚至不存在的東西? :) – 2013-08-05 16:25:16

+0

@VladLazarenko:我們經常這樣做:在創建它之前命名一些東西。當我尋找它時,我使用了各種搜索術語。 –

+0

非常感謝您的鏈接。這是一個有趣的閱讀。 – niemiro

1

只需將文件(通過固定內存塊)從必要位置覆蓋到文件開頭。

const size_t cBufSize = 10000000; // Adjust as you wish 
const UINT_PTR ofs = 38400; 
UINT_PTR readPos = ofs; 
UINT_PTR writePos = 0; 
UINT_PTR readedBytes = 0; 
1. BYTE *buf = // Allocate cBufSize memory buffer 
2. Seek to readPos 
3. Read cBufSize bytes to buf, remember actual readed number of bytes to readedBytes 
4. Seek to writePos 
5. Write readedBytes from buf 
6. Increase readPos and writePos on readedBytes value 
7. Repeat from step 2, until you get end of file. 
8. Reduce file size on ofs bytes. 
+0

感謝您的僞代碼:) – niemiro