Filesystem 函数
在线手册:中文  英文

is_writable

(PHP 4, PHP 5)

is_writable判断给定的文件名是否可写

说明

bool is_writable ( string $filename )

如果文件存在并且可写则返回 TRUEfilename 参数可以是一个允许进行是否可写检查的目录名。

记住 PHP 也许只能以运行 webserver 的用户名(通常为 'nobody')来访问文件。不计入安全模式的限制。

参数

filename

要检查的文件名称。

返回值

如果文件 filename 存在并且可写则返回 TRUE

范例

Example #1 is_writable() 例子

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

错误/异常

失败时抛出E_WARNING警告。

注释

Note: 此函数的结果会被缓存。参见 clearstatcache() 以获得更多细节。

Tip

自 PHP 5.0.0 起, 此函数也用于某些 URL 包装器。请参见 支持的协议和封装协议以获得支持 stat() 系列函数功能的包装器列表。

参见


Filesystem 函数
在线手册:中文  英文

用户评论:

gr (2010-10-05 03:32:50)

The results of this function seems to be not cached :
Tested on linux and windows

<?php
chmod
($s_pathFichier0400);
echo
'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
chmod($s_pathFichier04600);
echo
'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
exit;
?>

starrychloe at yahoo dot com (2008-02-10 05:50:18)

To Darek and F Dot: About group permissions, there is this note in the php.ini file:
; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off

wuhai (2007-09-25 21:46:09)

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

legolas558 d0t users dot sf dot net (2007-03-02 12:18:11)

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

haccel at email dot com (2006-08-03 17:51:42)

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...

haccel at email dot com (2006-08-02 20:56:33)

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...

}

?>

legolas558 dot sourceforge comma net (2006-07-13 01:17:07)

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

Nils Kuebler (2006-04-18 15:15:32)

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

greg at gregwhitescarver dotcalm (2006-02-07 06:55:04)

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.'

darek at fauxaddress dot com (2006-01-31 10:27:03)

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

JimmyNighthawk (2005-09-12 02:02:08)

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

claude dot paroz at ne dot ch (2004-04-06 04:28:04)

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

agrenier at assertex dot com (2004-04-02 04:56:18)

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($filename0666)) {
                 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;
        }
    } 
?>

易百教程