DirectoryIterator::isFile()
(PHP 5,PHP 7)
Determine if current DirectoryIterator item is a regular file
说明
public DirectoryIterator::isFile(void) : bool
Determines if the currentDirectoryIteratoritem is a regular file.
参数
此函数没有参数。
返回值
ReturnsTRUEif the file exists and is a regular file(not alinkordir),otherwiseFALSE
范例
Example#1DirectoryIterator::isFile()example
This example will list all regular files in the directory containing the script.
<?php
$iterator = new DirectoryIterator(dirname(__FILE__));
foreach ($iterator as $fileinfo) {
    if ($fileinfo->isFile()) {
        echo $fileinfo->getFilename() . "\n";
    }
}
?>
以上例程的输出类似于:
apple.jpg banana.jpg example.php pears.jpg
参见
- DirectoryIterator::getType() Determine the type of the current DirectoryIterator item
- DirectoryIterator::isDir() Determine if current DirectoryIterator item is a directory
- DirectoryIterator::isDot() Determine if current DirectoryIterator item is'.'or'..'
- DirectoryIterator::isLink() Determine if current DirectoryIterator item is a symbolic link
Documentation is a bit misleading. DirectoryIterator->isFile() and other classes (e.g. SplFileInfo->isFile()) return TRUE for symlinks of files. Better use getType() method instead, which returns 'link' for symlinks. This was reported long time ago - https://bugs.php.net/bug.php?id=72364 , but docs are still not fixed.
to actually sort a directoryiterator you need to subclass the iterator and use a comparator function similar to this one
<?php
function cmpSPLFileInfo( $splFileInfo1, $splFileInfo2 )
{
  return strcmp( $splFileInfo1->getFileName(), $splFileInfo2->getFileName() );
}
class DirList extends RecursiveDirectoryIterator
{
  private $dirArray;
  public function __construct( $p )
  {
    parent::__construct( $p );
    $this->dirArray = new ArrayObject();
    foreach( $this as $item )
    {
      $this->dirArray->append( $item );
    }
    $this->dirArray->uasort( "cmpSPLFileInfo" );
  }
  public function getIterator()
  {
    return $this->dirArray->getIterator();
  }
}
?>
shows all .jpg files in the current directory but how does the DirectoryIterator sort the output!?
$dir=new DirectoryIterator("./");
foreach ($dir as $file) {
 if ($dir->isDot()) {continue;}  //removes . and ..
  if (strripos($file,".jpg")==true) {
   echo $file . "<br>\n";
  }
 }I put in an example in __autoload, but it is useful here, too...
Yet another class/interface __autoload function. Includes an example usage of the SPL DirectoryIterator class, a settable case-ignore flag, and support for multiple file name patterns to allow easy integration from multiple sources.
<?php
/**
 * __autoload
 *
 * @author Ken Comer 
 * @copyright released into public domain 2005 Ken Comer
 */
define('IGNORE_CASE',true);
// comment out the define() of IGNORE_CASE to be
//  case-sensitive. I like to ignore case so that I can
//  use UPPERCASE for the test versions of the file.
/**
 * autoloads classes and interfaces for PHP5
 * 
 * @author Ken Comer
 */
function __autoload($class_name) {
 // This will be set the first time through.
 // Put your default values in the place indicated
 //  below so as to eliminate possible duplicates
 //  in the .ini include_path
 static $possible_path = NULL;
 // Leave this as NULL.
 
 // List here whatever formats you use for your
 //  file names. Note that, if you autoload
 //  a class that implements a non-loaded interface,
 //  you will also need to autoload that interface.
 static $permitted_formats = array(
  "&CLASS.class.inc"
  ,"&CLASS.class.inc.php"
  ,"&CLASS.class.inc.php5"
  ,"class.&CLASS.inc"
  ,"class.&CLASS.inc.php"
  ,"class.&CLASS.inc.php5"
  ,"&CLASS.interface.inc"
  ,"&CLASS.interface.inc.php"
  ,"&CLASS.interface.inc.php5"
  ,"i&CLASS.interface.inc"
  ,"i&CLASS.interface.inc.php"
  ,"i&CLASS.interface.inc.php5"
 );
 // Put the &CLASS wherever the $class_name 
 //  might appear
 // Only executed the first time __autoload is called
 if (NULL===$possible_path):
  // These are the default paths for this application
  $possible_path = array_flip(array(
    "."
    ,".."
    ,"../include"
    ,"/public_html/php/include"
  ));
  // Customize this yourself, but leave the
  //   array_flip alone. We will use this
  //   to get rid of duplicate entries from the
  //   include_path .ini list.
  // Merge the flipped arrays to get rid of duplicate
  //   "keys" (which are really the valid include
  //   paths) then strip out the keys leaving only
  //   uniques. This is marginally faster than
  //   using array_combine and array_unique and
  //   much more elegant. Okay, it's weird, too.
  $possible_path = array_keys(array_merge($possible_path,
      array_flip(explode(ini_get("include_path"),";"))));
 endif; /* static $possible_path initialization */
 $possibility = str_replace("&CLASS",$class_name,$permitted_formats);
 foreach ( $possible_path as $directory ) {
  if (!file_exists($directory) or !is_dir($directory))
  {
   continue;
  }
  $file_to_check = new DirectoryIterator($directory);
  foreach ( $file_to_check as $file ) {
   // ignore directories and files that do not contain
   // $class_name
   if ( !$file->isDir()
     and ( defined(IGNORE_CASE) && TRUE===IGNORE_CASE )
      ? stripos($file->getFileName(),$class_name)
      : strpos($file->getFileName(),$class_name) ) :
    
    // class_name was included, now compare against
    // all permitted file name patterns
    foreach ( $possibility as $compare ):
      if ((defined(IGNORE_CASE) && TRUE===IGNORE_CASE )
        ? !strcasecmp($compare,$file->getFileName())
        : $compare===$file->getFileName()
      ) {
       // by using $compare, you will get a qualified
       //  file name
       include_once($compare);
       return TRUE;
      }
    endforeach; /* $possibility */
   endif;
  } /* foreach $file_to_check */
 }
}
?>
Usage:
<?php
//open current directory
$dir = new DirectoryIterator(".");
// use do .. while since we need to iterate atleast once
// and the first two items are always "." and ".."
do {
  // if it isn't "." or ".."
  if (!$dir->isDot()) {
    // echo out pathname and "/" if it's a directory
    echo $dir->getPathname() . ($dir->isDir() ? "/" : "");
  }
} while ($dir->next())
?>
Outputs something like:
/path/file1
/path/dir1/
/path/file2
/path/file3
/path/dir2/
---
Note from the extension author:
Try this:
<?php
foreach(new DirectoryIterator(".") as $file)
{
  if (!$file->isDot()) {
    echo $file->getPathname() . ($file->isDir() ? "/" : "");
  }
}
?>
