• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DirectoryIterator::isFile()

    (PHP 5,PHP 7)

    Determine if current DirectoryIterator item is a regular file

    说明

    publicDirectoryIterator::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() ? "/" : "");
      }
    }
    ?>