如何检查PHP中的目录是否可写?

时间:2008-09-20 20:07:39

标签: php permissions directory

有谁知道如何查看目录在PHP中是否可写?

函数is_writable不适用于文件夹。 (编辑:它确实有效。请参阅接受的答案。)

10 个答案:

答案 0 :(得分:90)

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

  

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

答案 1 :(得分:17)

这是代码:)

<?php 

$newFileName = '/var/www/your/file.txt';

if ( ! is_writable(dirname($newFileName))) {

    echo dirname($newFileName) . ' must writable!!!';
} else {

    // blah blah blah
}

答案 2 :(得分:6)

更具体针对所有者/群组/世界

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

...和平

答案 3 :(得分:5)

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

$file_directory = dirname($file);

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

我希望这有助于某人。

答案 4 :(得分:4)

根据the documentation for is_writable,它应该可行 - 但你说“文件夹”,所以这可能是a Windows issue。评论提示a workaround

(早先的匆匆阅读使我认为尾随斜线是重要的,但结果证明这是特定于这项工作。)

答案 5 :(得分:3)

我编写了一个小脚本(我称之为 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>';
    } 
}
?>

答案 6 :(得分:2)

STAT()

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

http://us2.php.net/stat

答案 7 :(得分:1)

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

答案 8 :(得分:1)

我就是这样做的:

使用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');

答案 9 :(得分:1)

在我的情况下,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);
    }
}