【问题标题】:PHP: How to check if file not exists or permission is denied?PHP:如何检查文件是否不存在或权限被拒绝?
【发布时间】:2014-09-22 23:48:54
【问题描述】:

我想检查文件是否不存在。当file_exists() 函数返回false 时,我无法确定该文件是否不存在或者我没有该文件的权限。

如何辨别这两种可能性?

【问题讨论】:

  • 如果是因为文件所在的目录不可读,或者只是文件本身。如果是目录,那么设计是不可能找出来的。唯一的方法是在具有访问权限的用户下进行检查,但这会产生安全隐患。
  • 为什么还要检查这个?你需要它做什么?

标签: php permissions filesystems


【解决方案1】:

也许is_readable 是你想要的?

【讨论】:

  • 不,不是。因为is_readable 会检查文件是否存在且可读。我可以检查上层目录是否可读,但是有同样的问题。
【解决方案2】:

好吧,你可以先试试 file_exists()。如果失败,您可以尝试使用带有 +a 标志的 fopen()。如果失败,则说明您没有权限。

【讨论】:

    【解决方案3】:

    我想检查文件是否不存在。当file_exists() 函数返回false 时,我无法确定该文件是否不存在或者我没有该文件的权限。

    不,你一定是理解错了。如果文件存在,file_exists() 将返回 TRUE,否则返回 FALSE。这与该文件的权限无关。

    例如我的脚本无权读取的文件将使file_exists 返回TRUE,因为它存在。

    但是,如果我在该文件上使用 is_readable 进行测试,它将返回 FALSE。我没有读取文件的权限。

    例子:

    $file = 'unreadable';
    var_dump(file_exists($file), is_readable($file));
    

    输出:

    bool(true)
    bool(false)
    

    编辑: 自然,这与 PHP 用来获取文件存在和文件权限信息的底层系统库绑定。如果不允许 PHP 获取文件是否存在的状态,它会告诉你文件不存在。例如,如果您的目录存在,但用户不可读:

    $dir = 'unreadable';
    $file = $dir.'/unreadable.ext';
    
    var_dump(file_exists($dir), is_readable($dir));
    # bool(true)
    # bool(false)
    
    var_dump(file_exists($file), is_readable($file));
    # bool(false)
    # bool(false)
    

    由于你想获取$file的存在状态,底层权限不允许你获取。因此,该文件对您不存在。这同样正确,您应该更准确地了解您实际需要找出的内容。因为对你来说,文件不存在。这就是目录权限的工作原理(所有示例都在此处的 Windows 上运行,但这些东西很常见,您在每个常见的文件系统实现中都有它)。

    我希望这对您的问题有所帮助。

    【讨论】:

    • 试试这个例子:你有路径 1/2/3。文件 3 存在,但 PHP 没有读取目录 1/2 的权限。所以file_exist('1/2/3')返回false,但是文件存在于文件系统中。
    • 我会说如果你没有读取目录的权限,那么文件不存在。给你。这就是目录权限的重点......
    • @pablo:这不是您特别要求的-您所说的是文件系统的工作原理。也许您需要首先阅读文件系统,因为 PHP =/= Godmode - 文件系统函数(如果您不使用自己的流包装器)是针对您的操作系统的库编译的。你不能用你的操作系统(操作系统)做你不能用 PHP 做的事情。也许这对您的问题有所启发,而不是您看错了地方(例如 PHP)。
    • @Svish:当然,否则文件系统的权限将毫无用处;)
    • @Hakre Exactly :) 对不起,这是对巴勃罗的回应,不是反对你的回答,如果不清楚的话:)
    【解决方案4】:

    我编写了检查文件是否存在的函数。如果文件系统中没有这样的文件,则返回 false,否则返回 true。我的函数检查(自下而上)目录结构。应该相当确定$root 目录存在。

    private function fileCanExists($root, $path) {
        $root .= '/';
        if (file_exists($root . $path))
            return true;
        while ($path != '.') {
            $path = dirname($path);
            if (file_exists($root . $path)) {
                if (is_readable($root . $path))
                    return false;
                else
                    return true;
            }
        }
        return false;
    }
    

    这就是我写的意思:

    我想检查文件是否不存在。

    【讨论】:

      【解决方案5】:

      检查is_readable,如果返回false,检查file_exists

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 2020-02-05
        相关资源
        最近更新 更多