-->

PHP - Code to traverse a directory and get all the

2020-05-02 12:43发布

问题:

i want to write a page that will traverse a specified directory.... and get all the files in that directory...

in my case the directory will only contain images and display the images with their links...

something like this

How to Do it

p.s. the directory will not be user input.. it will be same directory always...

回答1:

/**
*  function get files 
*  @param $path string = path to fine files in 
*  @param $accept array = array of extensions to accept 
*  @param currentLevel = 0, stopLevel = 0 
*  @return array of madmanFile objects, but you can modify it to 
*  return whatever suits your needs.  
*/

    public static function getFiles( $path = '.', $accept, $currentLevel = 0, $stopLevel = 0){

            $path = trim($path);                    //trim whitespcae if any
            if(substr($path,-1)=='/'){$path = substr($path,0,-1);}  //cutoff the last "/" on path if provided
            $selectedFiles = array();
            try{
                    //ignore these files/folders
                    $ignoreRegexp = "/\.(T|t)rash/";
                    $ignore = array( 'cgi-bin', '.', '..', '.svn');
                    $dh = @opendir( $path );
                    //Loop through the directory
                    while( false !== ( $file = readdir( $dh ) ) ){
                            // Check that this file is not to be ignored
                            if( !in_array( $file, $ignore ) and !preg_match($ignoreRegexp,$file)){
                            $spaces = str_repeat( ' ', ( $currentLevel * 4 ) );
                                    // Its a directory, so we need to keep reading down...
                                    if( is_dir( "$path/$file" ) ){
                                            //merge current selectFiles array with recursion return which is
                                            //another array of selectedFiles
                                            $selectedFiles = array_merge($selectedFiles,MadmanFileManager::getFiles( "$path/$file", $accept, ($currentLe$
                                    } else{
                                            $info = pathinfo($file);
                                            if(in_array($info['extension'], $accept)){
                                                    $selectedFiles[] = new MadmanFile($info['filename'], $info['extension'], MadmanFileManager::getSize($

                                            }//end if in array
                                    }//end if/else is_dir
                            }
                    }//end while
                    closedir( $dh );
                    // Close the directory handle
            }catch (Exception $e){
                    echo 'Caught exception: ',  $e->getMessage(), "\n";
            }

            return $selectedFiles;
    }


回答2:

if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "$file\n";
        }
    }
    closedir($handle);
}

use readdir



回答3:

<?php 
//define directory
$dir = "images/";
//open directory
if ($opendir = opendir($dir)){
//read directory
 while(($file = readdir($opendir))!= FALSE ){
  if($file!="." && $file!= ".."){
   echo "<img src='$dir/$file' width='80' height='90'><br />";
  }
 }
} 
?>

source: phpacademy.org



回答4:

You'll want to use the scandir function to walk the list of files in the directory.



回答5:

Hi you can use DirectoryIterator

try {
    $dir = './';
    /* @var $Item DirectoryIterator */
    foreach (new DirectoryIterator($dir) as $Item) {
        if($Item->isFile()) {
            echo $Item->getFilename() . "\n";
        }
    }
} catch (Exception $e) {
    echo 'No files Found!<br />';
}

If you want to pass directories recursively: http://php.net/manual/en/class.recursivedirectoryiterator.php



回答6:

You could as others have suggested check every file in the dir, or you could use glob to identify files based on extension.



回答7:

I use something along the lines of:

if ($dir = dir('images'))
{       
    while(false !== ($file = $dir->read()))
    {
        if (!is_dir($file) && $file !== '.' && $file !== '..' && (substr($file, -3) === 'jpg' || substr($file, -3) === 'png' || substr($file, -3) === 'gif'))
        {
            // do stuff with the images
        }
    }
}
else { echo "Could not open directory"; }


回答8:

You could also try the glob function:

$path = '/your/path/';
$pattern = '*.{gif,jpg,jpeg,png}';

$images = glob($path . $pattern, GLOB_BRACE);

print_r($images);


回答9:

$dir = "/etc/php5/";

// Open a known directory, and proceed to read its contents

if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            echo "filename: $file : filetype: " . filetype($dir . $file) . "\n";
        }
        closedir($dh);
    }
}

For further reference :http://php.net/manual/en/function.opendir.php



回答10:

I would start off by creating a recursive function:

function recurseDir ($dir) {

    // open the provided directory
    if ($handle = opendir($_SERVER['DOCUMENT_ROOT'].$dir)) {

        // we dont want the directory we are in or the parent directory
        if ($entry !== "." && $entry !== "..") {

            // recursively call the function, if we find a directory
            if (is_dir($_SERVER['DOCUMENT_ROOT'].$dir.$entry)) {

                recurseDir($dir.$entry);
            }
            else {  

                // else we dont find a directory, in which case we have a file                          
                // now we can output anything we want here for each file
                // in your case we want to output all the images with the path under it
                echo "<img src='".$dir.$entry."'>";
                echo "<div><a href='".$dir.$entry."'>".$dir.$entry."</a></div>";
            }
        }
    }
}

The $dir param needs to be in the following format: "/path/" or "/path/to/files/"

Basically, just don't include the server root, because i have already done that below using $_SERVER['DOCUMENT_ROOT'].

So, in the end just call the recurseDir function we just made in your code once, and it will traverse any sub folders and output the image with the link under it.