C 使用Win32 API在特定偏移量处将文本插入文件

C 使用Win32 API在特定偏移量处将文本插入文件,c,winapi,file-io,C,Winapi,File Io,我正在寻找一种方法,使快速修改大型千兆字节的文件。Win32 API是否支持以特定偏移量将文本插入到文件中,而不必从头或从更改的偏移量将整个文件重写回磁盘 举个例子。假设我们在一个大小为1GB的文件中反复进行文本测试。如果我想转到500 MB偏移量并插入新文本,有没有一种方法可以插入它而不必从头重写整个文件,和/或不必重写最后500 MB的文件 可以使用Win32 API完成吗?如果没有,是否有任何策略可以优化这样的文本插入操作以最大限度地提高速度?有一些方法可以只重写插入点之后的部分,但通常情

我正在寻找一种方法,使快速修改大型千兆字节的文件。Win32 API是否支持以特定偏移量将文本插入到文件中,而不必从头或从更改的偏移量将整个文件重写回磁盘

举个例子。假设我们在一个大小为1GB的文件中反复进行文本测试。如果我想转到500 MB偏移量并插入新文本,有没有一种方法可以插入它而不必从头重写整个文件,和/或不必重写最后500 MB的文件


可以使用Win32 API完成吗?如果没有,是否有任何策略可以优化这样的文本插入操作以最大限度地提高速度?

有一些方法可以只重写插入点之后的部分,但通常情况下,没有-要在文件中的特定点插入内容,必须在该点之后重新写入所有内容

这可以归结为文件在磁盘上的存储方式——通常是以块的形式存储,因此此操作要么不可能,要么不容易。对于99%的情况,这并不重要,因此API没有公开一种实现这一点的方法


如果你可以控制文件格式,你可以设计一些方法,这样你可以将数据写到文件的末尾,但是可以有一些跟踪数据来说明这些东西确实属于这里。

有一些方法可以只重写插入点之后的部分,但一般来说,没有-在文件中的某个特定点插入某些东西,在那一点之后,你必须重写所有内容

这可以归结为文件在磁盘上的存储方式——通常是以块的形式存储,因此此操作要么不可能,要么不容易。对于99%的情况,这并不重要,因此API没有公开一种实现这一点的方法


如果你对文件格式有控制,你可以设计一些方法,这样你就可以把数据写到文件的末尾,但是有一些跟踪数据来说明这些东西真的属于这里。

< P>当你以读写模式打开文件时,你可以在文件中间写数据,但是这会覆盖现有的数据。没有简单的方法将数据插入到文件中

然而,当您在32位系统上使用64位系统时,为了使您的生活更轻松,这在您的特定场景中不起作用,使用内存映射文件是有意义的。使用文件API,您需要以一种巧妙的方式复制尾部。使用MMF,您可以执行以下操作: 1.创建文件映射并将文件映射到内存 2.使用memmove或类似的功能移动内存块,以进一步移动尾部,该功能可处理重叠块。 3.把你的字节放在中间。
使用这种方法,内存管理器将为您完成大部分工作 然而,当您在32位系统上使用64位系统时,为了使您的生活更轻松,这在您的特定场景中不起作用,使用内存映射文件是有意义的。使用文件API,您需要以一种巧妙的方式复制尾部。使用MMF,您可以执行以下操作: 1.创建文件映射并将文件映射到内存 2.使用memmove或类似的功能移动内存块,以进一步移动尾部,该功能可处理重叠块。 3.把你的字节放在中间。
使用这种方法,内存管理器将为您完成大部分工作

你不能这么做。您可以高效地执行的操作是将其附加到文件中。正如Thanatos所描述的那样,如果您想利用这一点,您需要在文件格式中构建一些结构


像往常一样,雷蒙德·陈已经成功了。他说的是从文件开头删除,但问题本质上与这个问题相同。

你不能这样做。您可以高效地执行的操作是将其附加到文件中。正如Thanatos所描述的那样,如果您想利用这一点,您需要在文件格式中构建一些结构


像往常一样,雷蒙德·陈已经成功了。他说的是从文件的开头删除,但问题基本上与这个问题相同。

如果是反复测试,您可以用新测试替换104857600次测试,并在文件末尾附加一次测试:这是一个精心设计的简化示例。在现实生活中,数据是随机的。然后,数据被错误地简化了如果它真的是一次又一次的测试,您可以用new替换104857600次测试,并在文件末尾追加一个测试:这是一个精心设计的简化示例。在现实生活中,数据是随机的。然后,数据被错误地简化了MS Word这样做是为了处理大型文档。有趣的是,Microsoft不支持这样做。对我来说,它似乎可以通过修改主文件表条目来实现,从而将硬盘驱动器扇区链接到所需的位置。有点像碎片整理,但与之相反。@Th
eo:这是可能的,但大多数文件系统可能只允许以512字节的倍数出现:扇区或集群大小,以FS将文件分块到的大小为准。那么,如果公开这样的功能,如果用户想要写入500字节,会发生什么?我是重新写入整个文件,还是只允许与可能在不同卷群集大小之间变化的卷相匹配的操作?其他进程/线程指向该文件的文件指针会发生什么情况?它们是相对于数据保持不变,还是保持在位置X?每一个都可能对一个应用程序造成同样的干扰。。。。最后,它可能归结为它太复杂了,保持简单更有益。以牺牲一些效率为代价。MS Word这样做是出于处理大型文档的需要。有趣的是,Microsoft不支持这样做。对我来说,它似乎可以通过修改主文件表条目来实现,从而将硬盘驱动器扇区链接到所需的位置。有点像碎片整理,但情况正好相反。@Theo:这是可能的,但大多数文件系统可能只允许以512字节的倍数进行碎片整理:扇区或群集大小,以FS将文件分块到的大小为准。那么,如果公开这样的功能,如果用户想要写入500字节,会发生什么?我是重新写入整个文件,还是只允许与可能在不同卷群集大小之间变化的卷相匹配的操作?其他进程/线程指向该文件的文件指针会发生什么情况?它们是相对于数据保持不变,还是保持在位置X?每一个都可能对一个应用程序造成同样的干扰。。。。最后,它可能归结为它太复杂了,保持简单更有益。是的,MM会做这项工作,我自己也用过这种方法。但是,您应该注意,这仍然会导致像他的示例中那样将文件的最后500 MB写回磁盘。@Zan当然,编程中没有奇迹:是的,MM将完成这项工作,我自己也使用过这种方法。但是,您应该注意,这仍然会导致将文件的最后500 MB写回磁盘,如他的示例所示。@Zan当然,编程中没有奇迹: