仅使用 fopen() 和 fclose() 清除文件是否安全?

Is it safe to clear a file only with: fopen() and fclose()?

我发现这个简单的函数可以简单地清除文件的内容:

function createEmptyFile($filename)
{
    //
    $fp = fopen($filename, 'w');
    //
    fclose($fp);
}

例如,重置日志,或其他。

但是我有一个疑问,这个函数是否真的100%安全,即它的行为是唯一确定的,结果会如预期的那样。

我有一种奇怪的感觉,文件有可能:可能没有被清理,或者可能被损坏,或者在某些情况下被随机数据填充。

我明白,也许这都是偏见,但我想知道到底有多正确。特别是,我对打开和关闭手柄之间没有任何命令感到困惑。

例如,我假设如果PHP 解释器将执行优化,那么由于缺少命令,在打开和关闭句柄之间,它可能会跳过这个块,或类似的东西。

对不起,如果我徒劳地制造恐慌。

I am confused by the absence of any command between opening and closing the handle.

让我把一些东西放在前面: 左边的“{”和右边的“}”括号是流控制,中间需要命令。 fopen()fclose() 不是。虽然这些只是 2 个命令,但它们继承了更多命令。

话虽如此,让我们看看他们的任务:fopen() 确实...

  • (a) 查找特定文件,
  • (b) 如果文件不存在则创建文件
  • (c) 打开文件只写,
  • (d) 将文件指针重定向到文件开头,
  • (e) 如果文件长于零,它将截断为零长度。

In particular, I am confused by the absence of any command between opening and closing the handle.

你看中间有很多"commands"。所以不用担心。

I have a strange feeling that there is a possibility that the file: may not be cleaned

确切地说,文件没有被清除,它被截断为零长度。该文件的早期数据仍在您的数据存储内存中。但这取决于您的操作系统。存在完全删除这些数据块的程序。

[...], or may be damaged

我不明白这个问题。您将要删除一个文件 - 您预计还会有什么损坏?

[...], or filled with random data in some case.

这是 C 风格,通过设置一个指向空闲内存的指针来创建变量,但不清除其中的数据,并将此职责交给您。但这里它只是截断而不是文件指针的重定向。这种恐惧可以被忽略。

But I have a question whether this function is really 100% safe, that is, its behavior is uniquely determined, and the result will be as expected.

是的,通常行为是唯一确定的。但是你必须预料到一些副作用:

  • 如果文件不存在,将创建该文件。您需要对该目录具有写入权限。 (否则它会返回 false)
  • 如果您没有对该文件的写入权限,它将返回 false。
  • 如果您的 php-环境使用 "safe mode",所有者和用户的可能差异会导致 fopen() 失败。您需要确保该文件仅由您使用。

您可能只写了 fopen() 而没有检查 return 参数。这可能会导致问题并导致:如果您没有正确反应,则不是 100% 安全。

所以 - 是的 fopen()fclose() 就足够了,正确并在工作未正确完成时通知您。