从文件中删除标题

时间:2013-08-05 16:12:02

标签: c++ winapi

我希望能够在C ++中编辑二进制文件的内容,并将所有内容删除到某个字符位置,我已经知道了,有点像从文件中删除标题。

我有一个示例文件包含130万字节,我想删除第一个38,400,然后以原始名称保存文件。

目前,我一直在进行缓冲读取以找到每个文件的位置(切割文件的位置的规则很复杂而且不是简单的搜索),当然,我可以做另一个缓冲读取从pos,输出到一个新文件,然后重命名,或沿着这些行。

但是要复制整个文件感觉非常沉重。有没有什么方法可以让操作系统(仅限Windows Vista及以上版本 - 不需要跨平台)重新定位文件的开头,并回收这些38,400字节?唉,我找不到办法了,所以为什么我会问你的协助:)

非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:2)

不,不支持在我熟悉的任何操作系统中删除文件的头部,包括任何版本的Windows。您必须物理移动要保留的字节,因此它们最终会在开始时结束。你可以通过一些努力来做到这一点,但最简单的方法是按照你的建议 - 写一个新文件然后重命名和删除舞蹈。

答案 1 :(得分:1)

你要找的是我称之为“lop”的操作,它有点像截断,但是在文件的前面。我在一段时间后发布了a question about it。不幸的是,没有这样的东西。

答案 2 :(得分: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.