我正在寻找一种方法来快速修改大型的千兆字节文件。 Win32 API是否支持将文本插入到特定偏移量的文件中,而无需从一开始或从更改的偏移量将整个文件重写回磁盘?
考虑一个例子。假设我们在一个大小为1 GB的文件中反复重复文本“test”。如果我想转到500 MB的偏移并插入文本“new”,有没有办法插入它而不必从头开始重写整个文件,和/或无需重写最后500 MB的文件?
可以使用Win32 API完成吗?如果没有,是否有任何策略来优化像这样的文本插入操作以最大化速度?
答案 0 :(得分:9)
有一些方法只能在插入点之后重写部分,但通常不会 - 在文件的特定点插入某些内容,您必须在该点之后重写所有内容。< / p>
这归结为文件存储在磁盘上的方式 - 通常是块,这样操作不可能或不容易。对于99%的情况,这没关系,因此API没有公开这样做的方法。 如果您可以控制文件格式,您可以设计出可以将数据写入文件末尾的方法,但是有一些跟踪数据可以说“这些东西真的属于这里”。
答案 1 :(得分:1)
当您以读写模式打开文件时,您可以在文件中间写入数据,但这将覆盖现有数据。没有简单的方法将数据插入文件。
但是,如果使用64位系统(在32位系统上,这在您的特定方案中无效)可以让您的生活更轻松,那么使用内存映射文件是有意义的。使用文件API,您需要以棘手的方式复制尾部。使用MMF,您可以执行以下操作: 1.创建文件映射并将文件映射到内存 2.使用memmove或类似功能移动内存块,进一步移动尾部,该函数关注重叠块。 3.把你的字节放在中间。
通过这种方法,内存管理器将为您完成大部分工作。
答案 2 :(得分:1)
你不能这样做。你可以有效地做什么是附加到文件。如果你想利用这个,你需要在文件格式中构建一些结构,就像Thanatos所描述的那样。
像往常一样,Raymond Chen有something to say on the matter。他正在谈论从文件的开头删除,但问题基本上与这个问题相同。