PHP: Funkce filesyst�mu - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<fileprobasename>
view the version of this page
Last updated: Thu, 15 Jul 2004

XXXI. Funkce filesyst�mu

Po�adavky

Pro toto roz���en� nejsou t�eba ��dn� extern� knihovny, ale jestli�e chcete, aby PHP na Linuxu podporovalo LFS (velk� soubory), pot�ebujete aktu�ln� knihovnu glibc a mus�te PHP zkompilovat s t�mito p�ep�na�i p�eklada�e: -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.

Instalace

K pou��v�n� t�chto funkc� nen� t�eba ��dn� instalace, jsou sou��st� j�dra PHP.

Konfigurace b�hu

Chov�n� t�chto funkc� je ovlivn�no nastaven�m parametr� v php.ini.

Tabulka 1. Filesystem and Streams Configuration Options

NameDefaultChangeable
allow_url_fopen"1"PHP_INI_SYSTEM
user_agentNULLPHP_INI_ALL
default_socket_timeout"60"PHP_INI_ALL
fromNULL??
auto_detect_line_endings"Off"PHP_INI_ALL

Zde je stru�n� vysv�tlen� konfigura�n�ch direktiv.

allow_url_fopen boolean

This option enables the URL-aware fopen wrappers that enable accessing URL object like files. Default wrappers are provided for the access of remote files using the ftp or http protocol, some extensions like zlib may register additional wrappers.

Pozn�mka: This setting can only be set in php.ini due to security reasons.

Pozn�mka: This option was introduced immediately after the release of version 4.0.3. For versions up to and including 4.0.3 you can only disable this feature at compile time by using the configuration switch --disable-url-fopen-wrapper.

Varov�n�

On Windows versions prior to PHP 4.3.0, the following functions do not support remote file accessing: include(), include_once(), require(), require_once() and the imagecreatefromXXX functions in the Image Functions extension.

user_agent string

Define the user agent for PHP to send.

default_socket_timeout integer

Default timeout (in seconds) for socket based streams.

Pozn�mka: This configuration option was introduced in PHP 4.3.0

from="[email protected]" string

Define the anonymous ftp password (your email address).

auto_detect_line_endings boolean

When turned on, PHP will examine the data read by fgets() and file() to see if it is using Unix, MS-Dos or Macintosh line-ending conventions.

This enables PHP to interoperate with Macintosh systems, but defaults to Off, as there is a very small performance penalty when detecting the EOL conventions for the first line, and also because people using carriage-returns as item separators under Unix systems would experience non-backwards-compatible behaviour.

Pozn�mka: This configuration option was introduced in PHP 4.3.0

P�eddefinovan� konstanty

Tyto konstanty jsou definov�ny t�mto roz���en�m a budou k dispozici pouze tehdy, bylo-li roz���en� zkompilov�no spole�n� s PHP nebo dynamicky zavedeno za b�hu.

GLOB_BRACE (integer)

GLOB_ONLYDIR (integer)

GLOB_MARK (integer)

GLOB_NOSORT (integer)

GLOB_NOCHECK (integer)

GLOB_NOESCAPE (integer)

PATHINFO_DIRNAME (integer)

PATHINFO_BASENAME (integer)

PATHINFO_EXTENSION (integer)

FILE_USE_INCLUDE_PATH (integer)

FILE_APPEND (integer)

FILE_IGNORE_NEW_LINES (integer)

FILE_SKIP_EMPTY_LINES (integer)

Viz tak�

Pro p��buzn� funkce viz tak� sekce Adres��e a Spou�t�n� program�.

Pro seznam a vysv�tlen� r�zn�ch URL wrapper�, kter� mohou b�t pou�ity jako vzd�len� soubory, viz tak� sekci L.

Obsah
basename -- Vr�t� ��st cesty obsahuj�c� n�zev souboru
chgrp -- Zm�nit skupinu souboru
chmod -- Zm�nit m�d souboru
chown -- Zm�n� vlastn�ka souboru
clearstatcache -- Vyma�e cache stavu soubor�
copy -- Zkop�ruje soubor
delete -- Fale�n� polo�ka manu�lu
dirname -- Vrac� ��st cesty obsahuj�c� n�zev adres��e
disk_free_space -- Returns available space in directory
disk_total_space -- Returns the total size of a directory
diskfreespace -- Vr�t� diskov� prostor dostupn� v adres��i
fclose -- Zav�e otev�en� deskriptor souboru
feof -- Test na konec souboru
fflush -- Zap�e obsah v�stupn�ho bufferu
fgetc -- Na�te 1 znak ze souboru
fgetcsv --  Na�te ��dek ze souboru a parsuje ho na CSV hodnoty
fgets -- P�e�te ��dek ze souboru
fgetss --  P�e�te ��dek ze souboru a odstran� HTML zna�ky
file_exists -- Zjist�, zda soubor existuje
file_get_contents -- Reads entire file into a string
file_put_contents -- Write a string to a file
file -- Na�te cel� soubor do pole
fileatime -- Vrac� �as posledn�ho p��stupu k souboru
filectime -- Vrac� �as zm�ny inodu souboru
filegroup -- Vrac� skupinu pro soubor
fileinode -- Vrac� inode souboru
filemtime -- Vrac� �as zm�ny souboru
fileowner -- Vrac� vlastn�ka souboru
fileperms -- Vrac� p��stupov� pr�va k souboru
filesize -- Vrac� velikost souboru
filetype -- Vrac� typ souboru
flock -- Jednotn� "portable advisory" zamyk�n� souboru
fnmatch -- Match filename against a pattern
fopen -- Otev�e soubor nebo URL
fpassthru --  Vyp�e v�echna zb�vaj�c� data v souboru
fputs -- Zap�e do souboru
fread -- Bin�rn� bezpe�n� �ten� ze souboru
fscanf -- Parsuje vstup ze souboru podle form�tu
fseek -- Posouv� ukazatel v souboru
fstat --  Vrac� informace o otev�en�m souboru
ftell -- Vrac� pozici v souboru
ftruncate --  Zkr�t� soubor na danou d�lku
fwrite -- Bin�rn� bezpe�n� z�pis do souboru
glob -- Find pathnames matching a pattern
is_dir -- Zjist�, zda je dan� soubor adres��em
is_executable -- Zjist�, zda je soubor spustiteln�
is_file --  Zjist�, zda se jedn� o oby�ejn� (regular) soubor
is_link --  Zjist�, zda se jedn� o symbolick� odkaz (link)
is_readable --  Zjist�, zda lze ze souboru ��st
is_uploaded_file -- Zjist�, zda byl soubor uploadov�n pomoc� HTTP POST
is_writable -- Zjist�, zda lze do souboru zapisovat
is_writeable -- Alias of is_writable()
link -- Vytvo�� hard link
linkinfo -- Vrac� informaci o odkazu (linku)
lstat --  Zji��uje informace o souboru nebo symbolick�m odkazu
mkdir -- Vytvo�� adres��
move_uploaded_file -- P�esune uploadovan� soubor na nov� m�sto
parse_ini_file -- Parse a configuration file
pathinfo -- Returns information about a file path
pclose -- Zav�e procesov� soubor (rouru)
popen -- Otev�e procesov� soubor (rouru)
readfile -- Vyp�e soubor
readlink -- Vrac� c�l symbolick�ho odkazu
realpath -- Vr�t� absolutn� cestu v kanonick�m tvaru
rename -- P�ejmenuje soubor
rewind -- Vr�t� ukazatel v souboru na za��tek
rmdir -- Odstran� adres��
set_file_buffer --  Nastav� buffer pro soubor
stat -- Zji��uje informace o souboru
symlink -- Vytvo�� symbolick� odkaz
tempnam -- Vytvo�� soubor s unik�tn�m n�zvem
tmpfile -- Vytvo�� do�asn� soubor
touch -- Nastavit �as zm�ny souboru
umask -- Zm�n� sou�asn� nastaven� umask
unlink -- Smazat soubor


add a note add a note User Contributed Notes
Funkce filesyst�mu
ben at nullcreations dot net
14-Nov-2004 10:29
Directed at: fankounter at libero dot it

Erm, I think you missed glob() which does what you're doing, only much more efficiently.

see:
fankounter at libero dot it
05-Nov-2004 02:31
// ls(dir,pattern) return file list in "dir" folder matching "pattern"
// ls("path","module.php?") search into "path" folder for module.php3, module.php4, ...
// ls("images/","*.jpg") search into "images" folder for JPG images

function ls($__dir="./",$__pattern="*.*")
{
 settype($__dir,"string");
 settype($__pattern,"string");

 $__ls=array();
 $__regexp=preg_quote($__pattern,"/");
 $__regexp=preg_replace("/[\\x5C][\x2A]/",".*",$__regexp);
 $__regexp=preg_replace("/[\\x5C][\x3F]/",".", $__regexp);

 if(is_dir($__dir))
  if(($__dir_h=@opendir($__dir))!==FALSE)
  {
   while(($__file=readdir($__dir_h))!==FALSE)
   if(preg_match("/^".$__regexp."$/",$__file))
     array_push($__ls,$__file);

   closedir($__dir_h);
   sort($__ls,SORT_STRING);
  }

 return $__ls;
}
m2pc (at) hotmail.com
07-Oct-2004 04:18
After searching all over the place to find a function to do what I wanted, I wrote the following:

  /*
  **  Returns an array of valid drives on the system (a:, b:, etc.)
  */
  function getSystemDrives () {
                        
   // Initialize
   $aResult = Array ();
 
   // Loop from A-Z and try opening the root dir
   for ($letter = 'A'; $letter <= 'Z'; $letter ++) {
     if (is_dir ($letter . ":"))
       $aResult [] = $letter . ":";
   }
  
   // Return results
   return ($aResult);
  }

It simply returns an array of valid drives as seen from the server (A:, B:, etc.).  This obviously is targeted to Win32 installations only.
Storm Reaver
13-Apr-2004 02:48
The way to write files on server where it is not possible (e.g. Gorodok.net)

<?php

 
function killfile($ftp, $login, $pass, $filename){
 
$conn_id = ftp_connect($ftp);
 
$login_result = ftp_login($conn_id, $login, $pass);
  if ((!
$conn_id) || (!$login_result)) { return false; } else {
  
$del = ftp_delete($conn_id, $filename);
   if (!
del) { return false; } else {return true;}
  }
 
ftp_close($conn_id);
 }

killfile("gorodok.net", "login", "password", "/path/file.extension");
  
// Erasing file on server
$fs = fopen("", "w");
  
// Opening file for writing
   // You can't open file 4 writing without 'killfile' function because there must be no such file on server for fopen write mode via FTP/

// Here we write what we need
  
fclose($fs);

 

?>
ken at xzone9 dot com
16-Mar-2004 08:46
The following will work on UNIX (from peeweeks code submitted for "Windows")---

function ls ($curpath) {
   $dir = dir($curpath);
   echo("<b>$curpath</b>");
   echo "<blockquote>";
   while ($file = $dir->read()) {

       if($file != "." && $file != "..") {
           if (is_dir($curpath.$file)) {
                               ls($curpath.$file."/");
             } else {
                 echo("$file<br>");
             }
       }
   }
   $dir->close();
   echo "</blockquote>";
   return;
}

//Use:

$startpath = "/home/mypath/";
ls($startpath);
http://iubito.free.fr
30-Dec-2003 12:39
Here is a function I wrote to get the relative path between 2 files or directory.

We suppose that paths are wrotten in Unix format (/ instead of windows \\)

<?php
/**
 * Return the relative path between two paths / Retourne le chemin relatif entre 2 chemins
 *
 * If $path2 is empty, get the current directory (getcwd).
 * @return string
 */
function relativePath($path1, $path2='')
{
   if (
$path2 == '') {
      
$path2 = $path1;
      
$path1 = getcwd();
   }

  
//Remove starting, ending, and double / in paths
  
$path1 = trim($path1,'/');
  
$path2 = trim($path2,'/');
   while (
substr_count($path1, '//')) $path1 = str_replace('//', '/', $path1);
   while (
substr_count($path2, '//')) $path2 = str_replace('//', '/', $path2);

  
//create arrays
  
$arr1 = explode('/', $path1);
   if (
$arr1 == array('')) $arr1 = array();
  
$arr2 = explode('/', $path2);
   if (
$arr2 == array('')) $arr2 = array();
  
$size1 = count($arr1);
  
$size2 = count($arr2);

  
//now the hard part :-p
  
$path='';
   for(
$i=0; $i<min($size1,$size2); $i++)
   {
       if (
$arr1[$i] == $arr2[$i]) continue;
       else
$path = '../'.$path.$arr2[$i].'/';
   }
   if (
$size1 > $size2)
       for (
$i = $size2; $i < $size1; $i++)
          
$path = '../'.$path;
   else if (
$size2 > $size1)
       for (
$i = $size1; $i < $size2; $i++)
          
$path .= $arr2[$i].'/';

   return
$path;
}
?>

Enjoy ! :-)
Gregor Mosheh
23-Aug-2003 12:23
This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It's similar in concept to the Unix find program.

 function findfile($location='',$fileregex='') {
   if (!$location or !is_dir($location) or !$fileregex) {
       return false;
   }
 
   $matchedfiles = array();
 
   $all = opendir($location);
   while ($file = readdir($all)) {
       if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
         $subdir_matches = findfile($location.'/'.$file,$fileregex);
         $matchedfiles = array_merge($matchedfiles,$subdir_matches);
         unset($file);
       }
       elseif (!is_dir($location.'/'.$file)) {
         if (preg_match($fileregex,$file)) {
             array_push($matchedfiles,$location.'/'.$file);
         }
       }
   }
   closedir($all);
   unset($all);
   return $matchedfiles;
 }

$htmlfiles = findfile('/some/dir','/\.(htm|html)$/');
Gregor Mosheh
17-Jul-2003 05:25
I needed a function to find disk usage for a directory and its subs, so here it is. It's kinda like the Unix du program, except it returns the usage in bytes, not blocks.

function du($location) {
   if (!$location or !is_dir($location)) {
     return 0;
   }

   $total = 0;

   $all = opendir($location);
   while ($file = readdir($all)) {
     if (is_dir($location.'/'.$file) and $file <> ".." and $file <> ".") {
         $total += du($location.'/'.$file);
         unset($file);
     }
     elseif (!is_dir($location.'/'.$file)) {
         $stats = stat($location.'/'.$file);
         $total += $stats['size'];
         unset($file);
     }
   }
   closedir($all);
   unset($all);
   return $total;
}

print du('/some/directory');
aggarwal_deep at hotmail dot com
16-Jul-2003 09:43
The following souce is the combination of 3 different function ,does the listing of the whole files in directories or sub-directories of a base directory(given). And find out the maximum file size of given application files. for example it will tell the maximum file size of ppt file that is placed in the directory.

<?

function showExtension($file){
 if(
is_file($file)){
  
$fileInfo = pathinfo($file);
  
$extension=$fileInfo["extension"];
} else {
  
$extension="";   
 }
 return
$extension;
}

function
fsize($size) {
      
$a = array("B", "KB", "MB", "GB", "TB", "PB");

      
$pos = 0;
       while (
$size >= 1024) {
            
$size /= 1024;
              
$pos++;
       }

     return
round($size,2)." ".$a[$pos];
}

 
   function
ls ($curpath) {
      
$dir = dir($curpath);
      
$file_namearr = array("ETC","PPT","XLS","DOC","PDF");
      
      
       echo(
"<b>$curpath</b>");
       echo
"<blockquote>";
      
$file_sizearr = array(1,1,1,1,1);   
       while (
$file = $dir->read()) {
           if(
$file != "." && $file != "..") {
               if (
is_dir($curpath.$file)) {
                  
ls($curpath.$file."/");
               }
               else  {
                  
$filext=    strtoupper(showExtension($curpath.$file));
                  
$curr_key = 0;
                  
$curr_key = array_search($filext,$file_namearr);
                   if(
$curr_key){
                      
//echo "<br>$filext:$curr_key";
                      
$curr_file_size = $file_sizearr[$curr_key];
                       if(
filesize($curpath.$file)>$curr_file_size){
                          
$file_sizearr[$curr_key]= intval(filesize($curpath.$file));
                       }   
                   }
                  
                          
//echo"<br> $file : ".fsize($curpath.$file);
              
}
           }
          
       }
//while ends
      
for($k=0;$k<5;$k++){
           echo
"<br>".$file_namearr[$k].":".fsize($file_sizearr[$k]); 
       }
      
$dir->close();
       echo
"</blockquote>";
       return;
   }
 
$startpath = "/home6/docmng/";
ls($startpath);
 
 
?>
l_domenech at yahoo dot ca
03-Jul-2003 05:25
In the code samples of the user-contributed notes, you'll find functions that sometimes need a slash at the end of a folder path and sometimes don't.

Here's a little function to append a slash at the end of a path if there isn't one already.

function append_slash_if_none($string)
   {
   if (ereg ("/$", $string))
       {
       return $string;
       }
   else
       {
       return ereg_replace("$", "/", $string);
       }
   }

(Replace with a backslash if you're on Windows...)
mitra at mitra dot biz
16-May-2003 05:10
[email protected] contributed this in response to a question on setting these variables ...
This option *IS* settable within your PHP scripts.
Example:

<?php
  ini_set
('auto_detect_line_endings', true);
 
$contents = file('unknowntype.txt');

 
ini_set('auto_detect_line_endings', false);
 
$content2 = file('unixfile.txt');
?>

Note, with PHP 4.3 anytime Mac files are read using fgets or file you'll need to auto_detect_line_endings since \n is otherwise assumed.  However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.

\\ Read a line from a MAC file
stream_get_line($fp, 4096, "\r");

\\ Read a line from a UNIX file
stream_get_line($fp, 4096, "\n");

\\ Read a line from a DOS file
stream_get_line($fp, 4096, "\r\n");

\\ Read a line up to any filesystem line ending
ini_set('auto_detect_line_endings', true); fgets($fp);

\\ You can also make up your own line ending characters:
\\ Read up to the first instance of ":"
stream_get_line($fp, 4096, ":");
peeweek at altern dot org
09-May-2003 12:06
here is a function that recurses all directories in a Windows Tree then displays for each directory its contents.

function ls ($curpath) {
   $dir = dir($curpath);
   echo("<b>$curpath</b>");
   echo "<blockquote>";
   while ($file = $dir->read()) {

       if($file != "." && $file != "..") {
           if (is_dir($curpath.$file)) {
                               ls($curpath.$file."\\");
             } else {
                 echo("$file<br>");
             }
       }
   }
   $dir->close();
   echo "</blockquote>";
   return;
}

Use:

$startpath = "D:\\something\\";
ls($startpath);
regis at webstuff dot com dot br
03-Apr-2003 03:49
Here is a useful function if you're having trouble writing raw bytes into a file.

It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.

function int2bytes($number){
  $byte = $number;
  $i=0;
  do{
   $dec_tmp = $byte;
  
   $byte = bcdiv($byte,256,0);
   $resto = $dec_tmp - (256 * $byte);
   $return[] = $resto;
  } while($byte >= 256);
  if($byte) $return[] = $byte;
  return array_reverse($return);
}

Example:

$arr = int2bytes(75832);

$arr will contain the following values:
Array
(
   [0] => 1
   [1] => 40
   [2] => 56
)

Now, to write this data to the file, just use a fputs() with chr(), just like this:

fputs($fp,chr($arr[0]).chr($arr[1]).chr($arr[2]))

-- Regis
Alex Chac�n
13-Mar-2003 04:03
[email protected]

Hi
Here there is a function that recursively print all the directories in a Unix system from initial path in pre-order.

$pathInicial = "/home1/desarrollo/";
recorrerDirectorioTree ($pathInicial);

function recorrer DirectorioTree($pathGeneral)
{
   echo $pathGeneral . "\n\n";
  
   chdir($pathGeneral);
   $dir = dir(".");
   $dir-> rewind();
   while ($fileName = $dir->read())
   {
       if ($fileName != "."  && $fileName != "..")
       {
           if (is_dir($fileName) && !is_link($fileName))
           {
               echo "$fileName \n";
               clearstatcache();
               recorrerDirectorioTree($pathGeneral.$fileName. "/");
               chdir($pathGeneral);
           }
       }
   }
   $dir->close();
   return;
}
jdhurn at uberidx dot com
08-Mar-2003 03:18
This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn't try to index files like .zip or .mp3 or any other file that doesn't contain readable information. It makes use of the Character Type Extension if it's loaded, if it's not then it uses Regular Expressions.

function is_binary($link)
{
     $tmpStr  = '';
     @$fp    = fopen($link, 'rb');
     @$tmpStr = fread($fp, 256);
     @fclose($fp);

     if($tmpStr != '')
     {
         $tmpStr = str_replace(chr(10), '', $tmpStr);
         $tmpStr = str_replace(chr(13), '', $tmpStr);

         $tmpInt = 0;

           for($i =0; $i < strlen($tmpStr); $i++)
         {
               if( extension_loaded('ctype') )
               {
                   if( !ctype_print($tmpStr[$i]) )
                         $tmpInt++;
               }
               else
               {
                   if( !eregi("[[:print:]]+", $tmpStr[$i]) )
                         $tmpInt++;
               }
           }

           if($tmpInt > 5)
               return(0);
           else
               return(1);
     }
     else
           return(0);
}
meheler at canada dot com
07-Mar-2002 07:55
Here is a useful function that checks for the existance of a file in PHP's include_path:

   // Searches PHP's include_path variable for the existance of a file
   // Returns the filename if it's found, otherwise FALSE.
   // Only works on a *nix-based filesystem
   // Check like: if (($file = file_exists_path('PEAR.php')) !== FALSE)
   function file_exists_path($file) {
       // Absolute path specified
       if (substr($path,0,1)=='/')
           return (file_exists($file))?realpath($file):FALSE;

       $paths = explode(':',ini_get('include_path'));
       foreach ($paths as $path) {
           if (substr($path,-1)!='/') $path = "$path/";
           if (file_exists("$path$file"))
               return realpath("$path$file");
       }
       return FALSE;
   }

Mike

<fileprobasename>
 Last updated: Thu, 15 Jul 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2004 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Sun Nov 14 23:09:54 2004 Local time zone must be set--see zic manual page