PHP Doku:: Prüft, ob in eine Datei geschrieben werden kann - function.is-writable.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDateisystemrelevante ErweiterungenDateisystemDateisystem-Funktionenis_writable

Ein Service von Reinhard Neidl - Webprogrammierung.

Dateisystem-Funktionen

<<is_uploaded_file

is_writeable>>

is_writable

(PHP 4, PHP 5)

is_writablePrüft, ob in eine Datei geschrieben werden kann

Beschreibung

bool is_writable ( string $filename )

Gibt TRUE zurück, wenn filename existiert und schreibbar ist. Der Dateinamens-Parameter kann auch ein Verzeichnisname sein, um prüfen zu können, ob ein Verzeichnis schreibbar ist.

Bedenken Sie, dass PHP mit der Benutzer-ID auf die Datei zugreift, unter der der Webserver läuft (oftmals ist dies 'nobody'). Beschränkungen durch safe_mode werden nicht berücksichtigt.

Parameter-Liste

filename

Der zu prüfende Dateiname.

Rückgabewerte

Gibt TRUE zurück, wenn filename existiert und schreibbar ist.

Beispiele

Beispiel #1 is_writable()-Beispiel

<?php
$filename 
'test.txt';
if (
is_writable($filename)) {
    echo 
'Die Datei kann geschrieben werden';
} else {
    echo 
'Die Datei kann nicht geschrieben werden';
}
?>

Fehler/Exceptions

Upon failure, an E_WARNING is emitted.

Anmerkungen

Hinweis: Die Ergebnisse dieser Funktion werden gecached. Weitere Details erhalten Sie bei clearstatcache().

Tipp

Seit PHP 5.0.0 kann diese Funktion mit einigen URL-Wrappern benutzt werden. Schauen Sie in der Liste unter Supported Protocols and Wrappers nach, welcher Wrapper die Funktionalität von stat() unterstützt.

Siehe auch

  • is_readable() - Prüft, ob eine Datei existiert und lesbar ist
  • file_exists() - Prüft, ob eine Datei oder ein Verzeichnis existiert
  • fwrite() - Schreibt Binärdaten in eine Datei


13 BenutzerBeiträge:
- Beiträge aktualisieren...
gr
5.10.2010 12:32
The results of this function seems to be not cached :
Tested on linux and windows

<?php
chmod
($s_pathFichier, 0400);
echo
'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
chmod($s_pathFichier, 04600);
echo
'<pre>';var_dump(is_writable($s_pathFichier));echo'</pre>';
exit;
?>
starrychloe at yahoo dot com
10.02.2008 14:50
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
26.09.2007 6:46
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
2.03.2007 21:18
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
4.08.2006 2:51
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
3.08.2006 5:56
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
13.07.2006 10:17
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
19.04.2006 0:15
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
7.02.2006 15:55
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
31.01.2006 19:27
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
12.09.2005 11:02
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
6.04.2004 13:28
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
2.04.2004 14:56
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;
        }
    }
?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)