Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : is_writable

is_writable

Tells whether the filename is writable (PHP 4, PHP 5)
bool is_writable ( string filename )

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.

Keep in mind that PHP may be accessing the file as the user id that the web server runs as (often 'nobody'). Safe mode limitations are not taken into account.

Parameters

filename

The filename being checked.

Return Values

Returns TRUE if the filename exists and is writable.

Examples

Example 659. is_writable() example

<?php
$filename
= 'test.txt';
if (
is_writable($filename)) {
   echo
'The file is writable';
} else {
   echo
'The file is not writable';
}
?>


Notes

Note:

The results of this function are cached. See clearstatcache() for more details.

Tip:

As of PHP 5.0.0 this function can also be used with some URL wrappers. Refer to Appendix O, List of Supported Protocols/Wrappers for a listing of which wrappers support stat() family of functionality.

Related Examples ( Source code ) » is_writable



Code Examples / Notes » is_writable

claude dot paroz

Under Windows, it only returns the read-only attribute status, not the actual permissions (ACL).
See http://bugs.php.net/bug.php?id=27609


nils kuebler

this one recursivly checks if a folder and all its contents are writeable
<?php
function is_removeable($dir)
{
  $folder = opendir($dir);
  while($file = readdir( $folder ))
if($file != '.' && $file != '..' &&
( !is_writable(  $dir."/".$file  ) ||
(  is_dir(   $dir."/".$file   ) && !is_removeable(   $dir."/".$file   )  ) ))
  {
closedir($dir);
return false;
  }
  closedir($dir);
  return true;
}
?>


legolas558 d0t users dot sf dot net

This is the latest version of is__writable() I could come up with.
It can accept files or folders, but folders should end with a trailing slash! The function attempts to actually write a file, so it will correctly return true when a file/folder can be written to when the user has ACL write access to it.
<?php
function is__writable($path) {
//will work in despite of Windows ACLs bug
//NOTE: use a trailing slash for folders!!!
//see http://bugs.php.net/bug.php?id=27609
//see http://bugs.php.net/bug.php?id=30931
if ($path{strlen($path)-1}=='/') // recursively return a temporary file path
   return is__writable($path.uniqid(mt_rand()).'.tmp');
else if (is_dir($path))
return is__writable($path.'/'.uniqid(mt_rand()).'.tmp');
// check tmp file for read/write capabilities
$rm = file_exists($path);
$f = @fopen($path, 'a');
if ($f===false)
return false;
fclose($f);
if (!$rm)
unlink($path);
return true;
}
?>


agrenier

This file_write() function will give $filename the write permission before writing $content to it.
Note that many servers do not allow file permissions to be changed by the PHP user.
<?php
function file_write($filename, &$content) {
if (!is_writable($filename)) {
if (!chmod($filename, 0666)) {
        echo "Cannot change the mode of file ($filename)";
        exit;
};
}
if (!$fp = @fopen($filename, "w")) {
echo "Cannot open file ($filename)";
exit;
}
if (fwrite($fp, $content) === FALSE) {
echo "Cannot write to file ($filename)";
exit;
}
if (!fclose($fp)) {
echo "Cannot close file ($filename)";
exit;
}
}
?>


legolas558 dot sourceforge comma net

Since looks like the Windows ACLs bug "wont fix" (see http://bugs.php.net/bug.php?id=27609) I propose this alternative function:
<?php
function is__writable($path) {
if ($path{strlen($path)-1}=='/')
return is__writable($path.uniqid(mt_rand()).'.tmp');
if (file_exists($path)) {
if (!($f = @fopen($path, 'r+')))
return false;
fclose($f);
return true;
}
if (!($f = @fopen($path, 'w')))
return false;
fclose($f);
unlink($path);
return true;
}
?>
It should work both on *nix and Windows
NOTE: you must use a trailing slash to identify a directory


f dot knodt

Same here with PHP 5.1.4. is_writable ignores my ACLs and also groups dont work sometimes.

jimmynighthawk

Regarding you might recognize your files on your web contructed by your PHP-scripts are grouped as NOBODY you can avoid this problem by setting up an FTP-Connection ("ftp_connect", "ftp_raw", etc.) and use methods like "ftp_fput" to create these [instead of giving out rights so you can use the usual "unsecure" way]. This will give the files created not the GROUP NOBODY - it will give out the GROUP your FTP-Connection via your FTP-Program uses, too.
Furthermore you might want to hash the password for the FTP-Connection - then check out:
http://dev.mysql.com/doc/mysql/en/Password_hashing.html


haccel

Ooooops, sorry! My mistake. is__writable should be:
<?php
function is__writable($path)
{
  if ($path{strlen($path)-1}=='/') //Start function again with tmp file...
     
      return is__writable($path.uniqid(mt_rand()).'.tmp');
 
  elseif (ereg('.tmp', $path))
  { //Check tmp file for read/write capabilities
     
      if (!($f = @fopen($path, 'w+')))
          return false;
      fclose($f);
      unlink($path);
      return true;
  }
  else //We have a path error.
     
      return 0; // Or return error - invalid path...
}
?>
The original could've deleted a folder if the path was invalid  to start with (no trailing slash..) and the folder was writable to begin with...


darek

It appears that is_writable() does not check full permissions of a file to determine whether the current user can write to it.  For example, with Apache running as user 'www', and a member of the group 'wheel', is_writable() returns false on a file like
-rwxrwxr-x           root         wheel          /etc/some.file


greg

In response to Darek:
We have two servers: one running PHP 5.0.4 and Apache 1.3.33, the other running PHP 4.3.5 and Apache 1.3.27.  The PHP 4 server exhibits the behavior you are describing, with is_writable() returning 'false' even though the www user is in the group that owns the file, but the PHP 5 server is returning 'true.'


wuhai

I was trying to create a new file using fwrite, and i had the following error.  Any idea?
Warning: fwrite(): supplied argument is not a valid stream resource in


haccel

Be careful of legolas558 dot sourceforge comma net's example, try this instead:
<?php
function is__writable($path)
{
if ($path{strlen($path)-1}=='/')

return is__writable($path.uniqid(mt_rand()).'.tmp');

elseif (file_exists($path) && ereg('.tmp', $path))
{

if (!($f = @fopen($path, 'w+')))
return false;
fclose($f);
unlink($path);
return true;
}
else

return 0; // Or return error - invalid path...
}
?>


Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker