PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

chdir> <dio_write
Last updated: Fri, 01 Jun 2007

view this page in

XXIX. Directory Functions

Introduction

Requirements

No external libraries are needed to build this extension.

Installation

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

Runtime Configuration

This extension has no configuration directives defined in php.ini.

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.

DIRECTORY_SEPARATOR (string)
PATH_SEPARATOR (string)

Note: The PATH_SEPARATOR was introduced with PHP 4.3.0-RC2.

See Also

For related functions such as dirname(), is_dir(), mkdir(), and rmdir(), see the Filesystem section.

Table of Contents

chdir — Change directory
chroot — Change the root directory
dir — Directory class
closedir — Close directory handle
getcwd — Gets the current working directory
opendir — Open directory handle
readdir — Read entry from directory handle
rewinddir — Rewind directory handle
scandir — List files and directories inside the specified path


add a note add a note User Contributed Notes
Directory Functions
phdwight at yahoo dot com
28-Mar-2007 03:45
I have posted this same observation in scandir, and found out that it is not limited to scandir alone but to ALL directory functions.

Directory functions DOES NOT currently supports Japanese characters.
dkflbk at nm dot ru
14-Sep-2006 11:29
I wrote a simple backup script which puts all files in his folder (and all of the sub-folders) in one TAR archive...
(It's classic TAR format not USTAR, so filename and path to it can't be longer then 99 chars)
<?php
/***********************************************************
 *   Title:  Classic-TAR based backup script v0.0.1-dev
  **********************************************************/

Class Tar_by_Vladson {
    var
$tar_file;
    var
$fp;
    function
Tar_by_Vladson($tar_file='backup.tar') {
       
$this->tar_file = $tar_file;
       
$this->fp = fopen($this->tar_file, "wb");
       
$tree = $this->build_tree();
       
$this->process_tree($tree);
       
fputs($this->fp, pack("a512", ""));
       
fclose($this->fp);
    }
    function
build_tree($dir='.'){
       
$handle = opendir($dir);
        while(
false !== ($readdir = readdir($handle))){
            if(
$readdir != '.' && $readdir != '..'){
               
$path = $dir.'/'.$readdir;
                if (
is_file($path)) {
                   
$output[] = substr($path, 2, strlen($path));
                } elseif (
is_dir($path)) {
                   
$output[] = substr($path, 2, strlen($path)).'/';
                   
$output = array_merge($output, $this->build_tree($path));
                }
            }
        }
       
closedir($handle);
        return
$output;
    }
    function
process_tree($tree) {
        foreach(
$tree as $pathfile ) {
            if (
substr($pathfile, -1, 1) == '/') {
               
fputs($this->fp, $this->build_header($pathfile));
            } elseif (
$pathfile != $this->tar_file) {
               
$filesize = filesize($pathfile);
               
$block_len = 512*ceil($filesize/512)-$filesize;
               
fputs($this->fp, $this->build_header($pathfile));
               
fputs($this->fp, file_get_contents($pathfile));
               
fputs($this->fp, pack("a".$block_len, ""));
            }
        }
        return
true;
    }
    function
build_header($pathfile) {
        if (
strlen($pathfile) > 99 ) die('Error');
       
$info = stat($pathfile);
        if (
is_dir($pathfile) ) $info[7] = 0;
       
$header = pack("a100a8a8a8a12A12a8a1a100a255",
           
$pathfile,
           
sprintf("%6s ", decoct($info[2])),
           
sprintf("%6s ", decoct($info[4])),
           
sprintf("%6s ", decoct($info[5])),
           
sprintf("%11s ",decoct($info[7])),
           
sprintf("%11s", decoct($info[9])),
           
sprintf("%8s", " "),
            (
is_dir($pathfile) ? "5" : "0"),
           
"",
           
""
           
);
       
clearstatcache();
       
$checksum = 0;
        for (
$i=0; $i<512; $i++) {
           
$checksum += ord(substr($header,$i,1));
        }
       
$checksum_data = pack(
           
"a8", sprintf("%6s ", decoct($checksum))
            );
        for (
$i=0, $j=148; $i<7; $i++, $j++)
           
$header[$j] = $checksum_data[$i];
        return
$header;
    }
}

header('Content-type: text/plain');
$start_time = array_sum(explode(chr(32), microtime()));
$tar = & new Tar_by_Vladson();
$finish_time = array_sum(explode(chr(32), microtime()));
printf("The time taken: %f seconds", ($finish_time - $start_time));
?>
engin bzzzt biz
01-Feb-2006 08:07
To join directory and file names in a cross-platform manner you can use the following function.

function join_path()
{
        $num_args = func_num_args();
        $args = func_get_args();
        $path = $args[0];
       
        if( $num_args > 1 )
        {
            for ($i = 1; $i < $num_args; $i++)
            {
                $path .= DIRECTORY_SEPARATOR.$args[$i];
            }
        }
       
        return $path;
}

It should do the following:
$src = join_path( '/foo', 'bar', 'john.jpg' );
echo $src; // On *nix -> /foo/bar/john.jpg

$src = join_path( 'C:\www', 'domain.com', 'foo.jpg' );
echo $src; // On win32 -> C:\\www\\domain.com\\foo.jpg
msh at onliners dot dk
30-Jan-2006 11:49
I would like to present these two simple functions for generating a complete directory listing - as I feel the other examples are to restrictive in terms of usage.

function dirTree($dir) {
    $d = dir($dir);
    while (false !== ($entry = $d->read())) {
        if($entry != '.' && $entry != '..' && is_dir($dir.$entry))
            $arDir[$entry] = dirTree($dir.$entry.'/');
    }
    $d->close();
    return $arDir;
}

function printTree($array, $level=0) {
    foreach($array as $key => $value) {
        echo "<div class='dir' style='width: ".($level*20)."px;'>&nbsp;</div>".$key."<br/>\n";
        if(is_array($value))
            printTree($value, $level+1);
    }
}

Usage is as simple as this:
$dir = "<any directory you like>";
$arDirTree = dirTree($dir);
printTree($arDirTree);

It is easy to add files to the tree also - so enjoy.
Nicolas Merlet - admin(at)merletn.org
22-Jan-2006 03:34
Here is a very similar function to *scandir*, if you are still using PHP4...

This recursive function will return an indexed array containing all directories or files or both (depending on parameters). You can specify the depth you want, as explained below.

<?php

// $path : path to browse
// $maxdepth : how deep to browse (-1=unlimited)
// $mode : "FULL"|"DIRS"|"FILES"
// $d : must not be defined
 
function searchdir ( $path , $maxdepth = -1 , $mode = "FULL" , $d = 0 )
{
   if (
substr ( $path , strlen ( $path ) - 1 ) != '/' ) { $path .= '/' ; }     
  
$dirlist = array () ;
   if (
$mode != "FILES" ) { $dirlist[] = $path ; }
   if (
$handle = opendir ( $path ) )
   {
       while (
false !== ( $file = readdir ( $handle ) ) )
       {
           if (
$file != '.' && $file != '..' )
           {
              
$file = $path . $file ;
               if ( !
is_dir ( $file ) ) { if ( $mode != "DIRS" ) { $dirlist[] = $file ; } }
               elseif (
$d >=0 && ($d < $maxdepth || $maxdepth < 0) )
               {
                  
$result = searchdir ( $file . '/' , $maxdepth , $mode , $d + 1 ) ;
                  
$dirlist = array_merge ( $dirlist , $result ) ;
               }
       }
       }
      
closedir ( $handle ) ;
   }
   if (
$d == 0 ) { natcasesort ( $dirlist ) ; }
   return (
$dirlist ) ;
}

?>

chdir> <dio_write
Last updated: Fri, 01 Jun 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites