web-dev-qa-db-fra.com

PHP lister tous les fichiers dans le répertoire

Duplicate possible:
Récupère la hiérarchie d'un répertoire avec PHP
Obtenir les noms de tous les fichiers d'un répertoire avec PHP

J'ai vu des fonctions pour lister tous les fichiers d'un répertoire mais comment puis-je lister tous les fichiers desous-répertoires aussi, donc renvoie un tableau comme?

$files = files("foldername");

Donc $files est quelque chose de similaire à

array("file.jpg", "blah.Word", "name.fileext")
44
Mark Lalor
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')) as $filename)
{
    // filter out "." and ".."
    if ($filename->isDir()) continue;

    echo "$filename\n";
}


Documentation PHP:

98
Matthew

Vous recherchez donc une liste de répertoires récursive?

function directoryToArray($directory, $recursive) {
    $array_items = array();
    if ($handle = opendir($directory)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if (is_dir($directory. "/" . $file)) {
                    if($recursive) {
                        $array_items = array_merge($array_items, directoryToArray($directory. "/" . $file, $recursive));
                    }
                    $file = $directory . "/" . $file;
                    $array_items[] = preg_replace("/\/\//si", "/", $file);
                } else {
                    $file = $directory . "/" . $file;
                    $array_items[] = preg_replace("/\/\//si", "/", $file);
                }
            }
        }
        closedir($handle);
    }
    return $array_items;
}
21
Ruel

Je pense que vous recherchez la fonction glob de php . Vous pouvez appeler glob(**) pour obtenir une liste de fichiers récursive.

EDIT: J'ai réalisé que mon glob ne fonctionnait pas de manière fiable sur tous les systèmes, alors je soumets cette version beaucoup plus jolie de la réponse acceptée.

function rglob($pattern='*', $flags = 0, $path='')
{
    $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT);
    $files=glob($path.$pattern, $flags);
    foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); }
    return $files;
}

à partir de: http://www.phpfreaks.com/forums/index.php?topic=286156.0

4
Chuck Vose
function files($path,&$files = array())
{
    $dir = opendir($path."/.");
    while($item = readdir($dir))
        if(is_file($sub = $path."/".$item))
            $files[] = $item;else
            if($item != "." and $item != "..")
                files($sub,$files); 
    return($files);
}
print_r(files($_SERVER['DOCUMENT_ROOT']));
2
user669677

J'avais besoin d'implémenter la lecture d'un répertoire donné, et en utilisant la fonction de Chuck Vose , j'ai créé cette page pour lire les répertoires qui s'appuient sur JQuery:

<?php

/**
 * Recovers folder structure and files of a certain path
 * 
 * @param string $path Folder where files are located
 * @param string $pattern Filter by extension
 * @param string $flags Flags to be passed to the glob
 * @return array Folder structure
 */
function getFolderTree($path)
{
    //Recovers files and directories
    $paths = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT);
    $files = glob($path . "*");

    //Traverses the directories found
    foreach ($paths as $key => $path)
    {
        //Create directory if exists
        $directory = explode("\\", $path);
        unset($directory[count($directory) - 1]);
        $directories[end($directory)] = getFolderTree($path);

        //Verify if exists files
        foreach ($files as $file)
        {
            if (strpos(substr($file, 2), ".") !== false)
                $directories[] = substr($file, (strrpos($file, "\\") + 1));
        }
    }

    //Return the directories
    if (isset($directories))
    {
        return $directories;
    }
    //Returns the last level of folder
    else
    {
        $files2return = Array();
        foreach ($files as $key => $file)
            $files2return[] = substr($file, (strrpos($file, "\\") + 1));
        return $files2return;
    }
}

/**
 * Creates the HTML for the tree
 * 
 * @param array $directory Array containing the folder structure
 * @return string HTML
 */
function createTree($directory)
{
    $html = "<ul>";
    foreach($directory as $keyDirectory => $eachDirectory)
    {
        if(is_array($eachDirectory))
        {
            $html .= "<li class='closed'><span class='folder'>" . $keyDirectory . "</span>";
            $html .= createTree($eachDirectory);
            $html .=  "</li>";
        }
        else
        {
            $html .= "<li><span class='file'>" . $eachDirectory . "</span></li>";
        }
    }
    $html .= "</ul>";

    return $html;
}

//Create output
$directory = getFolderTree('..\videos');
$htmlTree = createTree($directory["videos"]);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
        <title>PHP Directories</title>

        <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/jquery.treeview.css" />
        <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/demo/screen.css" />

        <script src="http://jquery.bassistance.de/treeview/lib/jquery.js" type="text/javascript"></script>
        <script src="http://jquery.bassistance.de/treeview/lib/jquery.cookie.js" type="text/javascript"></script>
        <script src="http://jquery.bassistance.de/treeview/jquery.treeview.js" type="text/javascript"></script>

        <script type="text/javascript" src="http://jquery.bassistance.de/treeview/demo/demo.js"></script>

    </head>
    <body>
        <div id="main">
            <ul id="browser" class="filetree">
                <?php echo $htmlTree;?>
            </ul>
        </div>
    </body>
</html>

La structure utilisée dans l’arbre avec JQuery, le site a été repris: http://jquery.bassistance.de/treeview/demo/

J'espère que cela est utile!

0
KiKo