在打开的文件中寻求0的速度比关闭文件然后再次打开的速度快吗?

时间:2020-01-18 03:56:57

标签: c file

假设我已经打开了一个文件。我想向其中写入一些新内容(覆盖文件中的所有旧内容)。我希望此操作无论文件大小如何都能有效地运行。

在已打开的文件中查找0比关闭文件然后再次打开要快吗?

1 个答案:

答案 0 :(得分:2)

在讨论哪种更快之前,首先我们必须证明它们是等效的。他们不是。

仅寻求0不足以确保所有内容都被覆盖。如果新内容缩短了怎么办?您必须寻找并截断才能确定。

没有截断打开文件的标准方法。 POSIX具有ftruncate,Windows具有SetEndOfFilefopen(filename, "w")是标准C。因此,查找和截断会带来兼容性问题。

请参见Is there a guaranteed and safe way to truncate a file from ANSI C FILE pointer?How to truncate a file in C?


围绕文件删除还有另一个细微的区别。在Unix上,如果删除文件,则任何打开的文件句柄都保持打开状态。数据将保留,直到关闭所有文件句柄。这通常被利用来拥有安全的临时文件:打开临时文件以进行读取和写入,立即删除文件,并继续读取和写入打开的文件句柄。看不见的临时文件。

假设您的文件句柄打开时,您的文件已删除。如果要查找和截断,您仍在使用相同的数据,但是没有文件。如果您fopen正在写入新文件。这可能会带来行为和安全隐患。

文件重命名也有类似的问题。如果在打开文件句柄时重命名了文件,则搜索和截断将与重命名的文件(there are various non-portable ways to get the filename from a file handle)一起使用。 fopen将打开一个具有旧名称的文件。


哪个更快?可能会查找并截断。 fopen仍然必须这样做,再加上查找与文件名关联的数据,检查权限等开销……

您可以轻松地对此进行基准测试。您也可以使用strace或您的操作系统的等效物来查看基础系统调用。