Home » Php » PHP list of specific files in a directory

PHP list of specific files in a directory

Posted by: admin April 23, 2020 Leave a comment

Questions:

The following code will list all the file in a directory

<?php
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle)))
    {
        if (($file != ".") 
         && ($file != ".."))
        {
            $thelist .= '<LI><a href="'.$file.'">'.$file.'</a>';
        }
    }

    closedir($handle);
}
?>

<P>List of files:</p>
<UL>
<P><?=$thelist?></p>
</UL>

While this is very simple code it does the job.

I’m now looking for a way to list ONLY files that have .xml (or .XML) at the end, how do I do that?

How to&Answers:
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle)))
    {
        if ($file != "." && $file != ".." && strtolower(substr($file, strrpos($file, '.') + 1)) == 'xml')
        {
            $thelist .= '<li><a href="'.$file.'">'.$file.'</a></li>';
        }
    }
    closedir($handle);
}

A simple way to look at the extension using substr and strrpos

Answer:

You’ll be wanting to use glob()

Example:

$files = glob('/path/to/dir/*.xml');

Answer:

$it = new RegexIterator(new DirectoryIterator("."), "/\.xml$/i"));

foreach ($it as $filename) {
    //...
}

You can also use the recursive variants of the iterators to traverse an entire directory hierarchy.

Answer:

I use this code:

<?php

{
//foreach (glob("images/*.jpg") as $large) 
foreach (glob("*.xml") as $filename) { 

//echo "$filename\n";
//echo str_replace("","","$filename\n");

echo str_replace("","","<a href='$filename'>$filename</a>\n");

}
}


?>

Answer:

LIST FILES and FOLDERS in a directory (Full Code):
p.s. you have to uncomment the 5th line if you want only for specific extensions

<?PHP
# The current directory
$directory = dir("./");

# If you want to turn on Extension Filter, then uncomment this:

Answer:

$allowed_ext = array(".sample", ".png", ".jpg", ".jpeg", ".txt", ".doc", ".xls"); ## Description of the soft: list_dir_files.php ## Major credits: phpDIRList 2.0 -(c)2005 Ulrich S. Kapp :: Systemberatung :: $do_link = TRUE; $sort_what = 0; //0- by name; 1 - by size; 2 - by date $sort_how = 0; //0 - ASCENDING; 1 - DESCENDING # # # function dir_list($dir){ $i=0; $dl = array(); if ($hd = opendir($dir)) { while ($sz = readdir($hd)) { if (preg_match("/^\./",$sz)==0) $dl[] = $sz;$i.=1; } closedir($hd); } asort($dl); return $dl; } if ($sort_how == 0) { function compare0($x, $y) { if ( $x[0] == $y[0] ) return 0; else if ( $x[0] < $y[0] ) return -1; else return 1; } function compare1($x, $y) { if ( $x[1] == $y[1] ) return 0; else if ( $x[1] < $y[1] ) return -1; else return 1; } function compare2($x, $y) { if ( $x[2] == $y[2] ) return 0; else if ( $x[2] < $y[2] ) return -1; else return 1; } }else{ function compare0($x, $y) { if ( $x[0] == $y[0] ) return 0; else if ( $x[0] < $y[0] ) return 1; else return -1; } function compare1($x, $y) { if ( $x[1] == $y[1] ) return 0; else if ( $x[1] < $y[1] ) return 1; else return -1; } function compare2($x, $y) { if ( $x[2] == $y[2] ) return 0; else if ( $x[2] < $y[2] ) return 1; else return -1; } }

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

## # We get the information here

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

## $i = 0; while($file=$directory->read()) { $file = strtolower($file); $ext = strrchr($file, '.'); if (isset($allowed_ext) && (!in_array($ext,$allowed_ext))) { // dump } else { $temp_info = stat($file); $new_array[$i][0] = $file; $new_array[$i][1] = $temp_info[7]; $new_array[$i][2] = $temp_info[9]; $new_array[$i][3] = date("F d, Y", $new_array[$i][2]); $i = $i + 1; } } $directory->close();

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

## # We sort the information here

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

# switch ($sort_what) { case 0: usort($new_array, "compare0"); break; case 1: usort($new_array, "compare1"); break; case 2: usort($new_array, "compare2"); break; }

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

# We display the infomation here

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

Answer:

$i2 = count($new_array); $i = 0; echo "<table border=1> <tr> <td width=150> File name</td> <td width=100> File Size</td> <td width=100>Last Modified</td> </tr>"; for ($i=0;$i<$i2;$i++) { if (!$do_link) { $line = "<tr><td align=right>" . $new_array[$i][0] . "</td><td align=right>" . number_format(($new_array[$i][1]/1024)) . "k"; $line = $line . "</td><td align=right>" . $new_array[$i][3] . "</td></tr>"; }else{ $line = '<tr><td align=right><A HREF="' . $new_array[$i][0] . '">' . $new_array[$i][0] . "</A></td><td align=right>"; $line = $line . number_format(($new_array[$i][1]/1024)) . "k" . "</td><td align=right>" . $new_array[$i][3] . "</td></tr>"; } echo $line; } echo "</table>"; ?>

Answer:

You should use glob.

glob('*.xml')

More about using glob and advanced filtering:

http://domexception.blogspot.fi/2013/08/php-using-functional-programming-for.html

Answer:

Simplest answer is to put another condition '.xml' == strtolower(substr($file, -3)).

But I’d recommend using glob instead too.

Answer:

You can extend the RecursiveFilterIterator class like this:

class ExtensionFilter extends RecursiveFilterIterator
{
  /**
  * Hold the extensions pass to the class constructor 
  */
  protected $extensions;

  /**
   * ExtensionFilter constructor.
   *  
   * @param RecursiveIterator $iterator
   * @param string|array $extensions Extension to filter as an array ['php'] or
   * as string with commas in between 'php, exe, ini'
   */
  public function __construct(RecursiveIterator $iterator, $extensions)
  {
     parent::__construct($iterator);
     $this->extensions = is_array($extensions) ? $extensions :  array_map('trim', explode(',', $extensions));
  }

  public function accept()
  {
      if ($this->hasChildren()) {
         return true;
      }

      return $this->current()->isFile() &&
         in_array(strtolower($this->current()->getExtension()), $this->extensions);
  }

  public function getChildren()
  {
     return new self($this->getInnerIterator()->getChildren(), $this->extensions);
  }

Now you can instantiate RecursiveDirectoryIterator with path as an argument like this:

 $iterator = new RecursiveDirectoryIterator('\path\to\dir');
 $iterator = new ExtensionFilter($iterator, 'xml, php, ini');

 foreach($iterator as $file)
 {
   echo $file . '<br />';
 }

This will list files under the current folder only.


To get the files in subdirectories also,
pass the $iterator ( ExtensionFIlter Iterator) to RecursiveIteratorIterator as argument:

$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);

Now run the foreach loop on this iterator. You will get the files with specified extension

Note:– Also make sure to run the ExtensionFilter before RecursiveIteratorIterator, otherwise you will get all the files

Answer:

The $files array will get all files in the directory which the specified extension

$directory = 'pathto/directory';
$files = array();
$allowed_ext = array( "xml", "png", "jpg", "jpeg", "txt", "doc", "xls","csv"); 
// Check if the directory exists or not
if (file_exists($directory) && is_dir($directory)) {
    // Get the files in the directory
    $scan_contents = scandir($directory);
    // Filter out the current (.) and parent (..) directories 
    $files_array = array_diff($scan_contents, array('.', '..'));
    // Get each files of our directory with line break
    foreach ($files_array as $file) {
        //Get the file path
        $file_path = "$directory/$file";
        // Get the file extension
        $file_ext = strtolower(pathinfo($file_path, PATHINFO_EXTENSION));        
        if (in_array($file_ext, $allowed_ext) ) {
            $files[] = $file_path;
        }
    }
} 
echo '<pre>$files:-';
print_r($files);
echo '</pre>';