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



PHP : Function Reference : Filesystem Functions

Filesystem Functions

Introduction

Requirements

No external libraries are needed to build this extension, but if you want PHP to support LFS (large files) on Linux, then you need to have a recent glibc and you need compile PHP with the following compiler flags: -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.

Installation

There is no installation needed to use these functions; they are part of the PHP core.

Runtime Configuration

The behaviour of these functions is affected by settings in php.ini.

Table 90. Filesystem and Streams Configuration Options

Name Default Changeable Changelog
allow_url_fopen "1" PHP_INI_ALL PHP_INI_ALL in PHP <= 4.3.4. PHP_INI_SYSTEM in PHP < 6. Available since PHP 4.0.4.
allow_url_include "0" PHP_INI_ALL PHP_INI_SYSTEM in PHP 5. Available since PHP 5.2.0.
user_agent NULL PHP_INI_ALL Available since PHP 4.3.0.
default_socket_timeout "60" PHP_INI_ALL Available since PHP 4.3.0.
from "" PHP_INI_ALL  
auto_detect_line_endings "0" PHP_INI_ALL Available since PHP 4.3.0.


Here's a short explanation of the configuration directives.

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.

Note:

This setting can only be set in php.ini due to security reasons.

Note:

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.

Warning:

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

allow_url_include boolean

This option allows the use of URL-aware fopen wrappers with the following functions: include(), include_once(), require(), require_once().

Note:

This setting requires allow_url_fopen to be on.

user_agent string

Define the user agent for PHP to send.

default_socket_timeout integer

Default timeout (in seconds) for socket based streams.

Note:

This configuration option was introduced in PHP 4.3.0

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

Note:

This configuration option was introduced in PHP 4.3.0

Resource Types

Predefined Constants

The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.

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)
PATHINFO_FILENAME (integer)
Since PHP 5.2.0.
FILE_USE_INCLUDE_PATH (integer)
Search for filename in include_path (since PHP 5).
FILE_APPEND (integer)
Append content to existing file.
FILE_IGNORE_NEW_LINES (integer)
Strip EOL characters (since PHP 5).
FILE_SKIP_EMPTY_LINES (integer)
Skip empty lines (since PHP 5).
FILE_BINARY (integer)
Binary mode (since PHP 6).
FILE_TEXT (integer)
Text mode (since PHP 6).

See Also

For related functions, see also the Directory and Program Execution sections.

For a list and explanation of the various URL wrappers that can be used as remote files, see also Appendix O, List of Supported Protocols/Wrappers.

Table of Contents

basename — Returns filename component of path
chgrp — Changes file group
chmod — Changes file mode
chown — Changes file owner
clearstatcache — Clears file status cache
copy — Copies file
delete — See unlink() or unset()
dirname — Returns directory name component of path
disk_free_space — Returns available space in directory
disk_total_space — Returns the total size of a directory
diskfreespace — Alias of disk_free_space()
fclose — Closes an open file pointer
feof — Tests for end-of-file on a file pointer
fflush — Flushes the output to a file
fgetc — Gets character from file pointer
fgetcsv — Gets line from file pointer and parse for CSV fields
fgets — Gets line from file pointer
fgetss — Gets line from file pointer and strip HTML tags
file_exists — Checks whether a file or directory exists
file_get_contents — Reads entire file into a string
file_put_contents — Write a string to a file
file — Reads entire file into an array
fileatime — Gets last access time of file
filectime — Gets inode change time of file
filegroup — Gets file group
fileinode — Gets file inode
filemtime — Gets file modification time
fileowner — Gets file owner
fileperms — Gets file permissions
filesize — Gets file size
filetype — Gets file type
flock — Portable advisory file locking
fnmatch — Match filename against a pattern
fopen — Opens file or URL
fpassthru — Output all remaining data on a file pointer
fputcsv — Format line as CSV and write to file pointer
fputs — Alias of fwrite()
fread — Binary-safe file read
fscanf — Parses input from a file according to a format
fseek — Seeks on a file pointer
fstat — Gets information about a file using an open file pointer
ftell — Tells file pointer read/write position
ftruncate — Truncates a file to a given length
fwrite — Binary-safe file write
glob — Find pathnames matching a pattern
is_dir — Tells whether the filename is a directory
is_executable — Tells whether the filename is executable
is_file — Tells whether the filename is a regular file
is_link — Tells whether the filename is a symbolic link
is_readable — Tells whether the filename is readable
is_uploaded_file — Tells whether the file was uploaded via HTTP POST
is_writable — Tells whether the filename is writable
is_writeable — Alias of is_writable()
lchgrp — Changes group ownership of symlink
lchown — Changes user ownership of symlink
link — Create a hard link
linkinfo — Gets information about a link
lstat — Gives information about a file or symbolic link
mkdir — Makes directory
move_uploaded_file — Moves an uploaded file to a new location
parse_ini_file — Parse a configuration file
pathinfo — Returns information about a file path
pclose — Closes process file pointer
popen — Opens process file pointer
readfile — Outputs a file
readlink — Returns the target of a symbolic link
realpath — Returns canonicalized absolute pathname
rename — Renames a file or directory
rewind — Rewind the position of a file pointer
rmdir — Removes directory
set_file_buffer — Alias of stream_set_write_buffer()
stat — Gives information about a file
symlink — Creates a symbolic link
tempnam — Create file with unique file name
tmpfile — Creates a temporary file
touch — Sets access and modification time of file
umask — Changes the current umask
unlink — Deletes a file

Code Examples / Notes » ref.filesystem

jdhurn

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


gregor mosheh

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)$/');


storm reaver

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("ftp://login:password@gorodok.net/path/file.extension", "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

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
");
            }
      }
  }
  $dir->close();
  echo "</blockquote>";
  return;
}
//Use:
$startpath = "/home/mypath/";
ls($startpath);


codatrix

The following underlisted function called "fcountext" is a function I wrote, for counting the number of file extensions within a given directory. Hope you find it satisfactory as there is no alternative solution via PHP's core filesystem's functions for counting the number of file extensions within a given directory.
<?php
/*
* Author: ORUNTA C. N.
* Email: codatrix@yahoo.com
*
* Name: fcountext()
* Function: To count the number of file extensions within a given directory.
* Argument(s): $dir, i.e. directory path - for e.g. 'htdocs/yahoo/'
* Return-type: Integer
*/

function fcountext($dir)
{
//Authenticate - if directory?
if(is_dir($dir)) {

//Open and establish directory handle/pointer
$dp = opendir($dir);

//Create extensible array
$afile = array();

//Set initializer array;
$i = 0;

//Read contents of directory into array $afile, thus:
while($content = readdir($dp)) {

//Concatenate filepath
$filepath = $dir.$content;

//Confirm any initial value within array...
if(!count($afile)) {

//Authenticate - if file?
if(is_file($filepath)) {

//Get extension using PHP's 'pathinfo'
$pathinfo = pathinfo($filepath);

//Store into the array
$afile[$i] = $pathinfo['extension'];
}

} else {

//Authenticate - if file?
if(is_file($filepath)) {

//Get extension using PHP's 'pathinfo'
$pathinfo = pathinfo($filepath);

//Count array into $len
$len = count($afile);

//Compare $pathinfo['extension'] with elements of array $afile
for($i=0; $i<$len; $i++) {
if($afile[$i] != $pathinfo['extension']) $stat = 'T';
else {
$stat = 'F';
break;
}
}

//If Status is true, then store into array
if($stat == 'T') {
$afile[$len] = $pathinfo['extension'];
}
}
}
}

//Count total no. of different extensions.
$extnum = count($afile);

//Return no. of ext.
return $extnum;

//Close directory
closedir($dp);

} else {

//Return no Value
return 'Invalid Directory';
}
}
?>
The above function can be incorporated as you deem fit into a class situation to be accessed publicly.


aggarwal_deep

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 "
$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"
$file : ".fsize($curpath.$file);
}
}

}//while ends
for($k=0;$k<5;$k++){
echo"
".$file_namearr[$k].":".fsize($file_sizearr[$k]);  
}
$dir->close();
echo "</blockquote>";
return;
}

$startpath = "/home6/docmng/";
ls($startpath);


?>


tim

Sorry, important typo in previous post:
$dodgychars = "[^0-9a-zA-z()_-]";
should be (notice captial Z)
$dodgychars = "[^0-9a-zA-Z()_-]";


mitra

Pollard@php.net 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, ":");


hans

PHP5 Object File
I couldn't find a File Object in PHP5, so I decided to create one myself.
When a function that needs a path requires the file it will output a temp file and return the path to it, so that ie. parse_ini_file will work with the file object using:
<?php
parse_ini_file($myFile->requireFilePath());
?>
It is avaible for download at:
http://www.lintoo.dk/public/dbase_and_file_class.zip
Hans Duedal


16-aug-2006 07:11

Note that file functions automatically handle HTTP response codes, and in case of "Location" header you will get content of new reloacated page:
<?php
$url = "http://nu-imaging.com/catalog/"; // here we have redirect to /catalog/1/
$fp = fopen($fp);
echo fread($fp, 1024); // we get content of /catalog/1/
fclose($fp);
?>


tim

Little function to sanitize a user supplied file name, and optionally force a file extension:
function sanitize_filename($filename, $forceextension="")
{
 /*
 1. Remove leading and trailing dots
 2. Remove dodgy characters from filename, including spaces and dots except last.
 3. Force extension if specified
 */
 
 $defaultfilename = "none";
 $dodgychars = "[^0-9a-zA-z()_-]"; // allow only alphanumeric, underscore, parentheses and hyphen
 
 $filename = preg_replace("/^[.]*/","",$filename); // lose any leading dots
 $filename = preg_replace("/[.]*$/","",$filename); // lose any trailing dots
 $filename = $filename?$filename:$defaultfilename; // if filename is blank, provide default
 $lastdotpos=strrpos($filename, "."); // save last dot position
 $filename = preg_replace("/$dodgychars/","_",$filename); // replace dodgy characters
 $afterdot = "";
 if ($lastdotpos !== false) { // Split into name and extension, if any.
   $beforedot = substr($filename, 0, $lastdotpos);
   if ($lastdotpos < (strlen($filename) - 1))
     $afterdot = substr($filename, $lastdotpos + 1);
 }
 else // no extension
   $beforedot = $filename;
 if ($forceextension)
   $filename = $beforedot . "." . $forceextension;
 elseif ($afterdot)
   $filename = $beforedot . "." . $afterdot;
 else
   $filename = $beforedot;
 return $filename;
}
echo sanitize_filename("..file<>@**()name.ddd.badextension", "extension")."\n";
echo sanitize_filename("..file<>@**()name.extension.ddd")."\n";
echo sanitize_filename("...", "extension")."\n";
echo sanitize_filename("...")."\n";
echo sanitize_filename("filename")."\n";
echo sanitize_filename("filename", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "extension")."\n";
echo sanitize_filename(".xyz...xxx..", "")."\n";
produces
file_____()name_ddd.extension
file_____()name_extension.ddd
none.extension
none
filename
filename.extension
xyz__.extension
xyz__.xxx


l_domenech

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


gregor mosheh

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');


tunnelareaten

I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I'll update this function soon.
usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);
search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);
search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);
<?php
function list_files($directory, $stringSearch, $searchHandler, $outputHandler) {
$errorHandler = false;
$result = array();
if (! $directoryHandler = @opendir ($directory)) {
 echo ("<pre>\nerror: directory \"$directory\" doesn't exist!\n</pre>\n");
return $errorHandler = true;
}
if ($searchHandler === 0) {
 while (false !== ($fileName = @readdir ($directoryHandler))) {
  if(@substr ($fileName, - @strlen ($stringSearch)) === $stringSearch) {
   @array_push ($result, $fileName);
  }
 }
}
if ($searchHandler === 1) {
 while(false !== ($fileName = @readdir ($directoryHandler))) {
  if(@substr_count ($fileName, $stringSearch) > 0) {
   @array_push ($result, $fileName);
  }
 }
}
if (($errorHandler === true) &&  (@count ($result) === 0)) {
 echo ("<pre>\nerror: no filetype \"$fileExtension\" found!\n</pre>\n");
}
else {
 sort ($result);
 if ($outputHandler === 0) {
  return $result;
 }
 if ($outputHandler === 1) {
  echo ("<pre>\n");
  print_r ($result);
  echo ("</pre>\n");
 }
}
}
?>


christian

I just learned that, to specify file names in a portable manner, you DON'T need 'DIRECTORY_SEPARATOR' - just use '/'. This really surprised and shocked me, as until now I typed about a zillion times 'DIRECTORY_SEPARATOR' to stay platform independent - unnecessary. Don't make the same mistake.

shouri

Here's a little script I added to my set of web pages to insert a line saying when the set of web pages were last updated:
<?php
$latesttime = 0;
if ($handle = opendir('/home/shouri/public_html')) {
while (false !== ($file = readdir($handle))) {
$recenttime = filemtime($file);
if ($recenttime > $latesttime )
$latesttime = $recenttime;
}
closedir($handle);
echo("Last updated on " . date("F d Y", $latesttime) . " at " . date("H:i", $latesttime) . " IST");
}
?>
The html output looks like:
Last updated on July 28 2007 at 20:19 IST


wsuttonjr

Here's a little function I wrote that I thought someone might find useful.  Ever notice those fancy breadcrumbed headings on Web sites such as Macromedia.com?  Ever say, "I want one, but I don't want to write the HTML in each time?"  Well, here you go.  This does that based on your directory structure.
Do note, however, that it only works if you use files and folders that are named like:
/my-folder/my-file.php
/my_folder/my_file.php
/My_Folder/My_File.php
/My-Folder/My-File.php
...and the variable <i>$path</i> must be similarly formatted.  A preceding forward slash (/) must be on that <i>$path</i>.  $_SERVER['PHP_SELF'], $_SERVER['DOCUMENT_ROOT'], and other $_SERVER variables always add that.
When I have some free time (sooner rather than later), I'm going to write a more in-depth script for this.  I just needed something simple for now.  You can expect a PHP 4 and PHP 5 script class dedicated to this one idea.  For now, this simple function does the trick.  Anyway, here you go:
<?php
function breadCrumbs($path)
{
/**
*  What it does is split a path string into its two base objects -- a
*  file name and a directory name.
*  
*  After that, it then splits the directory into an array of sub-
*  directories and adds them to a stack of links with keys of 'name'
*  (directory name) and 'href' (hyperlink reference path).
*
*  Each item in this indexed associative array is then stacked again
*  into an array of actual hyperlinks (i.e. <a href="Blah/Blah2.php">)
*  split by a tree notification ( > ) of sorts.
*
*  Finally, the entire string, which may look like:
*  <a href="#">Services</a> > <a href="#">Web</a>
*  has the current file being viewed added to it.  That finished string
*  is then returned to the calling script/function for display to the
*  browser.
*
*  The returned HTML may look like:
*  <a href="#">Services</a> > <a href="#">Web</a> > Home
*/

// set the index file and name for each directory
$dirIndex = 'Home.php';
$dirIndexName = 'Home';

// split $path into basename and dirname
$file = basename($path, '.php');
$dir  = dirname($path);

// change all backslashes to forward slashes
$dir  = str_replace('\\', '/', $dir);

// remove preceding forward slash (/)
$dir  = substr($dir, 1, strlen($dir));

// ** ADDED **
// add a trailing '/ ' to add a blank folder name - will be removed
// NOTE: This is to ensure that an array IS created
$dir .= '/ ';

// split dirname into an array
$dirs = preg_split('@\/@', $dir);

// get the last array index from $dirs
$lastIndex = count($dirs) - 1;

// remove last $dirs if empty
if ($dirs[$lastIndex] == '' || is_null($dirs[$lastIndex])) {
unset($dirs[$lastIndex]);
}

// remove empty dir
if ($dirs[$lastIndex] == ' ') {
unset($dirs[$lastIndex]);
}

// get an accurate directory count
$dirCount = count($dirs);

// create $link and $links variables
$link  = '/';
$links = array();

// stack each directory into a link and dirname
for ($i = 0; $i < count($dirs); $i++) {
// change $dirs[$i] into capitalized word(s) and add spaces (for
// grammatical correctness)
$link .= ucwords(preg_replace('@(-|_)@', ' ', $dirs[$i])) . '/';

$links[$i]['href'] = $link . $dirIndex;
$links[$i]['name'] = ucwords($dirs[$i]);
}

// instanciate $breadcrumbs array
$breadcrumbs = array();

// stack $links into HTML-equivalent links
for ($i = 0; $i < count($links); $i++) {
$breadcrumbs[$i] = '<a href="' . $links[$i]['href'] . '">' . $links[$i]['name'] . '</a>';
}

// see if links are needed or if a parent document
if ($dirs[0] == '' || empty($dirs[0])) {
// it is not so use just the file name
$breadcrumb = $file;
} else {
// it is so compile the links into a breadcrumb string
$breadcrumb  = '<a href="/' . $dirIndex . '">' . $dirIndexName . '</a> &#8212; ' . join($breadcrumbs, ' > ');
$breadcrumb .= ' > ' . $file;
}

// return compiled breadcrumb string
return $breadcrumb;
}
?>


designatevoid

Here's a function that checks if a string filename, absolute or relative, is valid or not.
<?php  
function validFilename($file)
{
   if( checkCurrentOS( 'Win' )) {
       // if has invalid filename, return false
       if ( preg_match( '/PRN|CON|AUX|CLOCK\$|NUL|COM\d|LPT\d/i', $file)) {
           return false;
       }
       
       $parts = explode( "\\", $file);
       
       // if a drive letter, approve (don't check it later)
       if (preg_match( '/[A-Za-z]:/', $parts[0] )) {
           $parts[0] = null;
       }
       
       // checks for invalid printable charactors or control charactors
       foreach ($parts as $part) {
           if( preg_match( '|[\^\|\?\*<\":>/\a\b\e\f\n\r\t]|', $part )) {
               return false;
           }
       }
       return true;            
   } else { // unix always passes
       return true;
   }
}

function checkCurrentOS($operatingSystem)
{
   $currentOS = substr( php_uname(), 0, 7 ) == "Windows" ? "Win" : "_Nix";
   if ( strcmp( $operatingSystem, $currentOS ) == 0 ) {
       return true;
   } else {
       return false;
   }
}
?>


meheler

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


regis

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


ciprian danea, cipriandanea

Here is a little script that will enumerate a directory (given as a string) recursively.
The main working function is get_dir($path,$max_depth='')
Optional aguments:
$max_depth : obvious it'll limit the recursive depth.
Not so optional:
$l=0 : the first call must omit this, or explicitly set it to 0, since it represents the starting depth
$total='': the current total filesize; it should also be left alone, although it autosets itself to 0 on the first call;
In order to do something with the files other than just echoing them, simply replace the echo functions with your own;
Thanks to:
dave at birko dot cjb dot net (for the nice filesize function)
vbwebprofi at gmx dot de  (for the fileperms function)
function get_dir($path,$max_depth='',$l=0,$total=''){
if(!is_dir($path))return;
$path=substr($path,-1)!="/"?$path."/":$path;
if(!$l){
echo "\nEnumerating directory $path :\n\n";
$total=0;
}
if($max_depth==='' || ($max_depth>$l && is_int($max_depth))) $test_depth=true;
else $test_depth=false;
$pre="";
$c=$l;
while($c--)$pre.="\t";
$dir=opendir($path);
while($f=readdir($dir)){
if($f=="."||$f=="..")continue;
$file=$path.$f;
$size="";
if(is_file($file)||!is_dir($file)){
$s=filesize($file);
$total+=$s;
$size="[ ".fsize($s)." ]";
}
else $f.="/";
while(strlen($size)<16)
$size=" ".$size;
echo "\n".get_permissions(fileperms($file)).$size.$pre."\t".$f;
if(is_dir($file) && $test_depth)
$total=get_dir($file,$max_depth,$l+1,$total);
}
if(!$l)
echo "\n\nTotal size: ".fsize($total);
return $total;
}
function get_permissions($fperms) {
  $out;
  if($fperms & 0x1000)     // FIFO pipe
    $out = 'p';
  elseif($fperms & 0x2000) // Character outecial
    $out = 'c';
  elseif($fperms & 0x3000) // Socket [ original value 0xD000, wrong for linux, but this is also registering as a directory... ant ideas?]
    $out = 's';
  elseif($fperms & 0x4000) // Directory
    $out = 'd';
  elseif($fperms & 0x6000) // Block outecial
    $out = 'b';
  elseif($fperms & 0x8000) // Regular
    $out = '-';
  elseif($fperms & 0xA000) // Symbolic Link
    $out = 'l';
  else                         // UNKNOWN
    $out = 'u';
  // owner
  $out .= (($fperms & 0x0100) ? 'r' : '-') .
         (($fperms & 0x0080) ? 'w' : '-') .
         (($fperms & 0x0040) ? (($fperms & 0x0800) ? 's' : 'x' ) :
                                  (($fperms & 0x0800) ? 'S' : '-'));
  // group
  $out .= (($fperms & 0x0020) ? 'r' : '-') .
         (($fperms & 0x0010) ? 'w' : '-') .
         (($fperms & 0x0008) ? (($fperms & 0x0400) ? 's' : 'x' ) :
                                  (($fperms & 0x0400) ? 'S' : '-'));
  // world
  $out .= (($fperms & 0x0004) ? 'r' : '-') .
          (($fperms & 0x0002) ? 'w' : '-') .
          (($fperms & 0x0001) ? (($fperms & 0x0200) ? 't' : 'x' ) :
                                 (($fperms & 0x0200) ? 'T' : '-'));
  return $out;
}
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];
}
//usage example
get_dir("/tmp/");    // full depth
get_dir("/tmp/",4); //maximum depth set to 4


peeweek

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
");
}
}
}
$dir->close();
echo "</blockquote>";
return;
}
Use:
$startpath = "D:\\something\\";
ls($startpath);


http://iubito.free.fr

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 ! :-)


ben

Directed at: fankounter at libero dot it
Erm, I think you missed glob() which does what you're doing, only much more efficiently.
see: http://php.net/glob


php_net

Correction to previous posts's code (had $fp instead of $url on second line)
<?php
$url = "http://nu-imaging.com/catalog/"; // here we have redirect to /catalog/1/
$fp = fopen($url);
echo fread($fp, 1024); // we get content of /catalog/1/
fclose($fp);
?>


28-may-2005 08:17

Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.) Again, please note, if you ask a question, report a bug, or request a feature, your note will be deleted.)

m2pc

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.


fankounter

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


hello

<?php
// faster "fcountext" function
function extCount ($dir) {
 if (is_dir ($dir)) {
   $g = glob ($dir . '/*.*');
   foreach ($g as $v) {
     $this = pathinfo($v);
     $e[] = $this['extension'];
   }
   // return extension count
   return count(array_unique($e));
   // alternately, you could return an array of the extensions found -
   return array_values(array_unique($e));
 }
 // otherwise
 return false;
}
?>


Change Language


Follow Navioo On Twitter
.NET Functions
Apache-specific Functions
Alternative PHP Cache
Advanced PHP debugger
Array Functions
Aspell functions [deprecated]
BBCode Functions
BCMath Arbitrary Precision Mathematics Functions
PHP bytecode Compiler
Bzip2 Compression Functions
Calendar Functions
CCVS API Functions [deprecated]
Class/Object Functions
Classkit Functions
ClibPDF Functions [deprecated]
COM and .Net (Windows)
Crack Functions
Character Type Functions
CURL
Cybercash Payment Functions
Credit Mutuel CyberMUT functions
Cyrus IMAP administration Functions
Date and Time Functions
DB++ Functions
Database (dbm-style) Abstraction Layer Functions
dBase Functions
DBM Functions [deprecated]
dbx Functions
Direct IO Functions
Directory Functions
DOM Functions
DOM XML Functions
enchant Functions
Error Handling and Logging Functions
Exif Functions
Expect Functions
File Alteration Monitor Functions
Forms Data Format Functions
Fileinfo Functions
filePro Functions
Filesystem Functions
Filter Functions
Firebird/InterBase Functions
Firebird/Interbase Functions (PDO_FIREBIRD)
FriBiDi Functions
FrontBase Functions
FTP Functions
Function Handling Functions
GeoIP Functions
Gettext Functions
GMP Functions
gnupg Functions
Net_Gopher
Haru PDF Functions
hash Functions
HTTP
Hyperwave Functions
Hyperwave API Functions
i18n Functions
IBM Functions (PDO_IBM)
IBM DB2
iconv Functions
ID3 Functions
IIS Administration Functions
Image Functions
Imagick Image Library
IMAP
Informix Functions
Informix Functions (PDO_INFORMIX)
Ingres II Functions
IRC Gateway Functions
PHP / Java Integration
JSON Functions
KADM5
LDAP Functions
libxml Functions
Lotus Notes Functions
LZF Functions
Mail Functions
Mailparse Functions
Mathematical Functions
MaxDB PHP Extension
MCAL Functions
Mcrypt Encryption Functions
MCVE (Monetra) Payment Functions
Memcache Functions
Mhash Functions
Mimetype Functions
Ming functions for Flash
Miscellaneous Functions
mnoGoSearch Functions
Microsoft SQL Server Functions
Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
Mohawk Software Session Handler Functions
mSQL Functions
Multibyte String Functions
muscat Functions
MySQL Functions
MySQL Functions (PDO_MYSQL)
MySQL Improved Extension
Ncurses Terminal Screen Control Functions
Network Functions
Newt Functions
NSAPI-specific Functions
Object Aggregation/Composition Functions
Object property and method call overloading
Oracle Functions
ODBC Functions (Unified)
ODBC and DB2 Functions (PDO_ODBC)
oggvorbis
OpenAL Audio Bindings
OpenSSL Functions
Oracle Functions [deprecated]
Oracle Functions (PDO_OCI)
Output Control Functions
Ovrimos SQL Functions
Paradox File Access
Parsekit Functions
Process Control Functions
Regular Expression Functions (Perl-Compatible)
PDF Functions
PDO Functions
Phar archive stream and classes
PHP Options&Information
POSIX Functions
Regular Expression Functions (POSIX Extended)
PostgreSQL Functions
PostgreSQL Functions (PDO_PGSQL)
Printer Functions
Program Execution Functions
PostScript document creation
Pspell Functions
qtdom Functions
Radius
Rar Functions
GNU Readline
GNU Recode Functions
RPM Header Reading Functions
runkit Functions
SAM - Simple Asynchronous Messaging
Satellite CORBA client extension [deprecated]
SCA Functions
SDO Functions
SDO XML Data Access Service Functions
SDO Relational Data Access Service Functions
Semaphore
SESAM Database Functions
PostgreSQL Session Save Handler
Session Handling Functions
Shared Memory Functions
SimpleXML functions
SNMP Functions
SOAP Functions
Socket Functions
Standard PHP Library (SPL) Functions
SQLite Functions
SQLite Functions (PDO_SQLITE)
Secure Shell2 Functions
Statistics Functions
Stream Functions
String Functions
Subversion Functions
Shockwave Flash Functions
Swish Functions
Sybase Functions
TCP Wrappers Functions
Tidy Functions
Tokenizer Functions
Unicode Functions
URL Functions
Variable Handling Functions
Verisign Payflow Pro Functions
vpopmail Functions
W32api Functions
WDDX Functions
win32ps Functions
win32service Functions
xattr Functions
xdiff Functions
XML Parser Functions
XML-RPC Functions
XMLReader functions
XMLWriter Functions
XSL functions
XSLT Functions
YAZ Functions
YP/NIS Functions
Zip File Functions
Zlib Compression Functions
eXTReMe Tracker