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

问题描述 投票:1回答:1

我发现了这个简单的功能,可以简单地清除文件内容:

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

例如,重置日志或其他。

但是我有一个问题,这个功能是否真的100%安全,也就是说,它的行为是唯一确定的,其结果是否符合预期。

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

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

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

抱歉,如果我徒然制造恐慌。

php function reset
1个回答
2
投票

我对打开和关闭手柄之间没有任何命令感到困惑。

让我在前面放一些东西:左“ {”和右“}”括号是流控制,并且需要在两者之间使用命令。 fopen()fclose()不是。尽管这些只是2条命令,但它们继承了更多命令。

那是让我们调查他们的任务:fopen()是...

  • ((a)查找特定文件,
  • ((b)如果文件不存在,它将创建文件
  • [(c)打开仅用于写入的文件,
  • (d)将文件指针重定向到文件的开头,>
  • ((e)如果文件长于零,它将被截断为零长度。
  • 尤其是我对打开和关闭手柄之间没有任何命令感到困惑。

您会看到它们之间有许多“命令”。所以不用担心。

我有一种奇怪的感觉,认为该文件:可能无法清除

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

[...],或可能已损坏

我不明白这个问题。您将要删除文件-您还会受到什么损害?

[...],或在某些情况下填充随机数据。

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

但是我有一个问题,这个功能是否真的100%安全,也就是说,它的行为是唯一确定的,其结果是否符合预期。

是,通常,行为是唯一确定的。但是您必须期待一些副作用:

  • 如果文件不存在,将创建它。您需要对该目录具有写访问权。 (否则它将返回false)
  • 如果没有对该文件的写访问权,它将返回false。
  • 如果您的php环境使用“安全模式”,则所有者和用户的可能差异会导致fopen()失败。您需要确保该文件仅由您自己使用。
  • 可能会发生,您只写fopen()而不检查返回参数。这可能会导致问题并导致:如果您没有正确反应,则不是100%安全。

所以-是的fopen()fclose()足够,请更正并通知您是否工作不正确。

© www.soinside.com 2019 - 2024. All rights reserved.