0

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

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

目前,我一直在进行缓冲读取以查找每个文件的位置(剪切文件的规则很复杂,不是简单的搜索),当然,我可以从 pos 进行另一个缓冲读取,输出到一个新文件中,然后进行重命名,或者类似的东西。

但是不得不复制整个文件感觉相当沉重。有什么方法可以让操作系统(仅限 Windows Vista 及更高版本 - 不需要跨平台)重新定位文件的开头,并回收那些 38,400 字节?唉,我找不到办法,所以我为什么要请你帮忙:)

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

4

3 回答 3

2

不,不支持在我熟悉的任何操作系统中删除文件头,包括任何版本的 Windows。您必须物理移动要保留的字节,以便它们在开始时结束。您可以付出一些努力,但最简单的方法是按照您的建议 - 编写一个新文件,然后执行重命名和删除舞蹈。

于 2013-08-05T16:20:32.223 回答
1

您正在寻找的是我所说的“lop”操作,它有点像截断,但在文件的前面。前段时间我发布了一个关于它的问题。不幸的是,没有这样的东西可用。

于 2013-08-05T16:19:46.047 回答
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.
于 2013-08-05T16:20:49.160 回答