How do I check if a directory is writeable in PHP?

PhpPermissionsDirectory

Php Problem Overview


Does anyone know how I can check to see if a directory is writeable in PHP?

The function is_writable doesn't work for folders.

> Edit: It does work. See the accepted answer.

Php Solutions


Solution 1 - Php

Yes, it does work for folders....

> Returns TRUE if the filename exists and is writable. The filename argument may be a directory name allowing you to check if a directory is writable.

Solution 2 - Php

this is the code :)

<?php 

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

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

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

    // blah blah blah
}

Solution 3 - Php

to be more specific for owner/group/world

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

peace...

Solution 4 - Php

You may be sending a complete file path to the is_writable() function. is_writable() will return false if the file doesn't already exist in the directory. You need to check the directory itself with the filename removed, if this is the case. If you do that, is_writable will correctly tell you whether the directory is writable or not. If $file contains your file path do this:

$file_directory = dirname($file);

Then use is_writable($file_directory) to determine if the folder is writable.

I hope this helps someone.

Solution 5 - Php

According to http://uk.php.net/manual/en/function.is-writable.php">the documentation for is_writable, it should just work - but you said "folder", so this could be http://bugs.php.net/bug.php?id=27609">a Windows issue. The comments suggest http://uk.php.net/manual/en/function.is-writable.php#68098">a workaround.

(A rushed reading earlier made me think that trailing slashes were important, but that turned out to be specific to this work around).

Solution 6 - Php

I've written a little script (I call it isWritable.php) that detects all directories in the same directory the script is in and writes to the page whether each directory is writable or not. Hope this helps.

<?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>';
    } 
}
?>

Solution 7 - Php

stat()

Much like a system stat, but in PHP. What you want to check is the mode value, much like you would out of any other call to stat in other languages (I.E. C/C++).

http://us2.php.net/stat

Solution 8 - Php

According to the PHP manual is_writable should work fine on directories.

Solution 9 - Php

In my case, is_writable returned true, but when tried to write the file - an error was generated.
This code helps to check if the $dir exists and is writable:

<?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);
    }
}

Solution 10 - Php

this is how I do it:

create a file with file_put_contents() and check the return value, if it is positive (number of written in Bytes) then you can go ahead and do what you have to do, if it is FALSE then it is not writable

$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";

then you can delete the dummy file by using unlink()

unlink('directory/dummy.txt');

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSeanDowneyView Question on Stackoverflow
Solution 1 - PhpDGMView Answer on Stackoverflow
Solution 2 - PhpIrfan EVRENSView Answer on Stackoverflow
Solution 3 - PhpGriffithView Answer on Stackoverflow
Solution 4 - Phpuser189249View Answer on Stackoverflow
Solution 5 - PhpQuentinView Answer on Stackoverflow
Solution 6 - PhpStudocwhoView Answer on Stackoverflow
Solution 7 - PhpJason MockView Answer on Stackoverflow
Solution 8 - PhpLasarView Answer on Stackoverflow
Solution 9 - PhpAndronView Answer on Stackoverflow
Solution 10 - PhpNassimView Answer on Stackoverflow