Winapi 如何从文件中删除数据/字符?

Winapi 如何从文件中删除数据/字符?,winapi,Winapi,我正在写一个程序来编辑一个txt文件 但我发现windows API WriteFile只能向文件中添加数据/字符,而不能从文件中删除数据 我提出的唯一解决方案是使用ReadFile将整个文件读入缓冲区,然后使用循环逐个移动数据,然后用新文件替换旧文件。但我想这可能会让我的程序变得很慢 有人能帮忙吗 谢谢 如果您试图从文件末尾删除,使用truncate()和ftruncate()可以非常快速地删除 您试图从何处删除数据?如果它是从中间开始的,则必须使用fseek():如果文件包含“ABCDEFG

我正在写一个程序来编辑一个txt文件

但我发现windows API WriteFile只能向文件中添加数据/字符,而不能从文件中删除数据

我提出的唯一解决方案是使用ReadFile将整个文件读入缓冲区,然后使用循环逐个移动数据,然后用新文件替换旧文件。但我想这可能会让我的程序变得很慢

有人能帮忙吗


谢谢

如果您试图从文件末尾删除,使用
truncate()
ftruncate()
可以非常快速地删除

您试图从何处删除数据?如果它是从中间开始的,则必须使用
fseek()
:如果文件包含“ABCDEFG”,并且要删除“DEF”,则使用
fseek()
到达G,将“G”复制到缓冲区中,
fseek
到“C”所在的位置,然后
write()
那里有什么。然后使用
ftruncate()
将文件截断为正确的大小


如果这真的成为您的性能问题,那么您需要以一种能够解释这一问题的方式来设计文件,或者使用某种数据库。您可能还希望使用内存映射文件,但通常这最好由其他人编写的数据库来完成,而不是重新发明轮子。

文件是线性数据流。如果要从文件中删除内容,必须重新写入已删除部分后面的文件的所有内容。因此,除非要删除的内容位于文件末尾,否则您将需要执行一些写入操作。在最坏的情况下,为了删除文件的第一个字节,您需要在删除的字节之外重新写入整个文件


FWIW,Raymond Chen就这个问题写了一篇很好的文章:

感谢您的快速回复!=]但是像notepad.exe这样的文本编辑器通常使用哪种方法?谢谢嗯,notepad.exe的内存中已经有该文件的内容。所以当你点击save时,它可能会从一开始就把所有的内容都写出来。对于文本编辑器来说,I/O性能不是什么大问题,因为您最多只能处理几兆字节。谢谢!我想我要用内存映射。但在我的例子中,另一个程序也在编辑该文件。这会导致任何同步问题吗?谢谢谢谢大卫·赫夫曼。实际上,我主要处理的是从文件中间删除数据。但这是一篇提高我知识水平的好文章。我认为结论是“我必须重写删除部分以外的所有内容”,正如你所说。非常感谢!=]