【问题标题】:How do I check if a directory is writeable in PHP?如何检查目录是否可在 PHP 中写入?
【发布时间】:2010-09-11 16:07:47
【问题描述】:

有谁知道我如何检查一个目录是否可以用 PHP 写?

is_writable 函数不适用于文件夹。

编辑:它确实有效。查看接受的答案。

【问题讨论】:

    标签: php permissions directory


    【解决方案1】:

    是的,它确实适用于文件夹......

    如果文件名存在且可写,则返回 TRUE。文件名参数可能是一个目录名,允许您检查目录是否可写。

    【讨论】:

    • 诀窍在于,您不能指定一个在您真正要测试的文件夹中尚不存在的 文件 - 只需指定文件夹即可。
    【解决方案2】:

    这是代码:)

    <?php 
    
    $newFileName = '/var/www/your/file.txt';
    
    if ( ! is_writable(dirname($newFileName))) {
    
        echo dirname($newFileName) . ' must writable!!!';
    } else {
    
        // blah blah blah
    }
    

    【讨论】:

    • 啊,dirname($new_file_name),这比我打算做的要简单。我打算使用pathinfo($new_file_name,PATHINFO_DIRNAME)。谢谢。
    【解决方案3】:

    更具体的所有者/组/世界

    $dir_writable = substr(sprintf('%o', fileperms($folder)), -4) == "0774" ? "true" : "false";
    

    和平...

    【讨论】:

    • 这个功能应该改进。现在它会为0777之类的权限返回false。
    【解决方案4】:

    您可能正在向is_writable() 函数发送完整的文件路径。如果文件在目录中不存在,is_writable() 将返回 false。如果是这种情况,您需要检查已删除文件名的目录本身。如果你这样做,is_writable 将正确地告诉你该目录是否可写。如果$file 包含您的文件路径,请执行以下操作:

    $file_directory = dirname($file);
    

    然后使用is_writable($file_directory)判断文件夹是否可写。

    我希望这对某人有所帮助。

    【讨论】:

      【解决方案5】:

      根据the documentation for is_writable,它应该可以工作 - 但你说的是“文件夹”,所以这可能是a Windows issue。 cmets建议a workaround

      (之前的匆忙阅读让我认为尾部斜杠很重要,但事实证明这是针对此工作的)。

      【讨论】:

        【解决方案6】:

        我编写了一个小脚本(我称之为isWritable.php),它检测脚本所在目录中的所有目录并写入页面,无论每个目录是否可写。希望这会有所帮助。

        <?php
        // isWritable.php detects all directories in the same directory the script is in
        // and writes to the page whether each directory is writable or not.
        
        $dirs = array_filter(glob('*'), 'is_dir');
        
        foreach ($dirs as $dir) {
            if (is_writable($dir)) {
                echo $dir.' is writable.<br>';
            } else {
                echo $dir.' is not writable. Permissions may have to be adjusted.<br>';
            } 
        }
        ?>
        

        【讨论】:

        • 你可以使用 $dirs = glob('*', GLOB_ONLYDIR);
        【解决方案7】:

        统计()

        很像系统统计信息,但在 PHP 中。您要检查的是模式值,就像您在其他语言(即 C/C++)中对 stat 的任何其他调用一样。

        http://us2.php.net/stat

        【讨论】:

          【解决方案8】:

          根据 PHP 手册 is_writable 应该可以在目录上正常工作。

          【讨论】:

            【解决方案9】:

            在我的例子中,is_writable 返回 true,但是在尝试写入文件时 - 生成了错误。
            此代码有助于检查 $dir 是否存在且可写:

            <?php
            $dir = '/path/to/the/dir';
            
            // try to create this directory if it doesn't exist
            $booExists     = is_dir($dir) || (mkdir($dir, 0774, true) && is_dir($dir));
            $booIsWritable = false;
            if ($booExists && is_writable($dir)) {
                $tempFile = tempnam($dir, 'tmp');
                if ($tempFile !== false) {
                    $res = file_put_contents($tempFile, 'test');
            
                    $booIsWritable = $res !== false;
                    @unlink($tempFile);
                }
            }
            

            【讨论】:

              【解决方案10】:

              这就是我的做法:

              file_put_contents()创建一个文件并检查返回值,如果它是正数(写入字节数)那么你可以继续做你必须做的事情,如果它是FALSE那么它是不可写的

              $is_writable = file_put_contents('directory/dummy.txt', "hello");
              
              if ($is_writable > 0) echo "yes directory it is writable";
              
              else echo  "NO directory it is not writable";
              

              然后你可以使用 unlink() 删除虚拟文件

              unlink('directory/dummy.txt');
              

              【讨论】:

              • 虽然这在技术上可行,但绝对不是推荐的方法。文件系统操作相对较慢并且会产生大量开销,因此创建一个虚拟文件然后删除/取消链接它比大多数其他方法慢很多
              猜你喜欢
              • 2012-02-19
              • 1970-01-01
              • 2017-06-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-08
              • 2011-01-01
              • 2015-03-16
              相关资源
              最近更新 更多