Directories
在线手册:中文  英文

Directory 函数

参见

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

Table of Contents


Directories
在线手册:中文  英文

用户评论:

Ant P. (2009-09-12 16:01:13)

A simple reminder, but one most people (me included) will forget:
If you're writing portable code, don't blindly assume URLs and filesystem paths have a 1:1 mapping! There could be any number of things affecting them - the server might have mod_rewrite rules, you could be in a chroot, PHP could even be running over FastCGI on a separate machine from the webserver entirely.
Also don't rely on relative paths just because you think your own code hasn't called chdir(); you can use dirname($_SERVER[SCRIPT_FILENAME]) to figure out where you should be.

billy (2008-02-18 13:22:43)

msh at onliners dot dk's code should have
$dir.'/'.$entry everywhere instead of $dir.$entry
you need your system's directory separator, otherwise you'll get /my/pathfilename instead of correctly /my/path/filename

Jean-Paul Wattiaux (2007-08-31 20:08:09)

Mine works as long as the samba volume is actually mounted. Having it listed in the "My Computer" window doesn't warrant that.

adrian (2007-08-20 14:33:37)

Samba mounts under a Windows environment are not accessible using the mounted drive letter. For instance, if you have drive X: in Windows mounted to //example.local/shared_dir (where example.local is a *nix box running Samba), the following constructs
$dir = "X:\\data\\";
$handle = opendir( $dir );
or
$d = dir( $dir );
will return a warning message "failed to open dir: No error"
On the other hand, using the underlying mapping info works just fine. For example:
$dir = "//example.local/shared_dir/data";
$handle = opendir( $dir );
or
$d = dir( $dir );
Both cases do what they're expected to.

phdwight at yahoo dot com (2007-03-27 19:45:24)

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 (2006-09-14 16:29:43)

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->fppack("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($path2strlen($path));
                } elseif (
is_dir($path)) {
                    
$output[] = substr($path2strlen($path)).'/';
                    
$output array_merge($output$this->build_tree($path));
                }
            }
        }
        
closedir($handle);
        return 
$output;
    }
    function 
process_tree($tree) {
        foreach( 
$tree as $pathfile ) {
            if (
substr($pathfile, -11) == '/') {
                
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->fpfile_get_contents($pathfile));
                
fputs($this->fppack("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 (2006-02-01 12:07:19)

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 (2006-01-30 03:49:01)

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 (2006-01-22 07:34:06)

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 = -$mode "FULL" $d )
{
   if ( 
substr $path strlen $path ) - ) != '/' ) { $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 >=&& ($d $maxdepth || $maxdepth 0) )
               {
                   
$result searchdir $file '/' $maxdepth $mode $d ) ;
                   
$dirlist array_merge $dirlist $result ) ;
               }
       }
       }
       
closedir $handle ) ;
   }
   if ( 
$d == ) { natcasesort $dirlist ) ; }
   return ( 
$dirlist ) ;
}

?>

易百教程