2013-08-05 3 views
0

Я хотел бы иметь возможность редактировать содержимое двоичного файла на C++ и удалять все содержимое до определенной позиции символа, которое я уже знаю, немного напоминает удаление заголовка из файла ,Удалить заголовок из файла

Один пример файла У меня есть 1,3 миллиона байт, и я хотел бы удалить первые 38 400, а затем сохранить файл под исходным именем.

В настоящее время я делаю буферизованное чтение, чтобы найти позицию для каждого файла (правила для того, где вырезать файл сложны, и это не простой поиск), и, конечно, я мог бы сделать еще одну буферизированную читать из pos, выводить в новый файл, затем переименовывать или что-то в этом направлении.

Но он чувствует себя довольно тяжело, чтобы скопировать весь файл. Есть ли способ, которым я могу просто получить ОС (только для Windows Vista & - перекрестная платформа не требуется), чтобы перенести начало файла и переработать эти 38 400 байтов? Увы, я не могу найти пути, поэтому я бы попросил у вас вашу помощь :)

Огромное спасибо за любую помощь, которую вы можете предложить.

+0

Скопировал весь файл слишком долго? – willj

+0

Это не займет больше времени, чем я ожидал, но некоторые из файлов более 2 ГБ, так что они не слишком малы. В любом случае, спасибо вам всем за вашу помощь. Очень ценю :) – niemiro

+0

Я только что нашел какое-то дополнительное объяснение, почему оно не реализовано: http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx – niemiro

ответ

2

Нет, нет поддержки для удаления главы файла в любой ОС, с которой я знаком, включая любую версию Windows. Вы должны физически перемещать байты, которые хотите сохранить, поэтому они заканчиваются в начале. Вы могли бы сделать это на месте с некоторыми усилиями, но самый простой способ - как вы предлагаете - написать новый файл, а затем переименовать и удалить танец.

1

Что вы ищете, это то, что я называю операцией «lop», которая вроде как усечка, но в передней части файла. Я отправил a question about it некоторое время назад. К сожалению, такой вещи нет.

+0

Итак, вы дали назвать то, чего даже не существует? :) –

+0

@ VladLazarenko: Мы делаем это очень часто: назовите что-нибудь, прежде чем мы его создадим. Когда я пошел искать его, я использовал все условия поиска. –

+0

Большое спасибо за эту ссылку. Это было интересное чтиво. – niemiro

1

Просто перезапишите файл (по фиксированным блокам памяти) из необходимого pos в начало файла.

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

Смежные вопросы