PHP-script om door alle bestanden in een map te bladeren?

Ik ben op zoek naar een PHP-script dat door alle bestanden in een map loopt, zodat ik dingen met de bestandsnaam kan doen, zoals formatteren, afdrukken of toevoegen aan een link. Ik wil de bestanden kunnen sorteren op naam, type of op datum gemaakt/toegevoegd/aangepast. (Denk aan de mooie directory “index”.) Ik zou ook graag uitsluitingen aan de lijst met bestanden willen kunnen toevoegen, zoals het script zelf of andere “systeem”-bestanden. (Zoals de .en ..“directories”.)

Omdat ik het script graag zou willen kunnen wijzigen, ben ik meer geïnteresseerd in het bekijken van de PHP-documenten en leren hoe ik er zelf een kan schrijven. Dat gezegd hebbende, laat het me weten als er bestaande scripts, tutorials en dergelijke zijn.


Antwoord 1, autoriteit 100%

Je kunt de DirectoryIteratorgebruiken. Voorbeeld uit php-handleiding:

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}
?>

Antwoord 2, autoriteit 18%

Als je geen toegang hebt tot de DirectoryIterator-klasse, probeer dan dit:

<?php
$path = "/path/to/files";
if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;
        // do something with the file
    }
    closedir($handle);
}
?>

Antwoord 3, autoriteit 11%

Gebruik de functie scandir():

<?php
    $directory = '/path/to/files';
    if (!is_dir($directory)) {
        exit('Invalid diretory path');
    }
    $files = array();
    foreach (scandir($directory) as $file) {
        if ($file !== '.' && $file !== '..') {
            $files[] = $file;
        }
    }
    var_dump($files);
?>

Antwoord 4, autoriteit 8%

U kunt ook gebruik maken van FilesystemIterator. Het vereist nog minder code dan DirectoryIteratoren verwijdert automatisch .en ...

// Let's traverse the images directory
$fileSystemIterator = new FilesystemIterator('images');
$entries = array();
foreach ($fileSystemIterator as $fileInfo){
    $entries[] = $fileInfo->getFilename();
}
var_dump($entries);
//OUTPUT
object(FilesystemIterator)[1]
array (size=14)
  0 => string 'aa[1].jpg' (length=9)
  1 => string 'Chrysanthemum.jpg' (length=17)
  2 => string 'Desert.jpg' (length=10)
  3 => string 'giphy_billclinton_sad.gif' (length=25)
  4 => string 'giphy_shut_your.gif' (length=19)
  5 => string 'Hydrangeas.jpg' (length=14)
  6 => string 'Jellyfish.jpg' (length=13)
  7 => string 'Koala.jpg' (length=9)
  8 => string 'Lighthouse.jpg' (length=14)
  9 => string 'Penguins.jpg' (length=12)
  10 => string 'pnggrad16rgb.png' (length=16)
  11 => string 'pnggrad16rgba.png' (length=17)
  12 => string 'pnggradHDrgba.png' (length=17)
  13 => string 'Tulips.jpg' (length=10)

Link:
http://php.net/manual/en/class.filesystemiterator.php


Antwoord 5, autoriteit 2%

U kunt deze code gebruiken om recursiefdoor een directory te bladeren:

$path = "/home/myhome";
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {
    echo $file."\n";
}

Antwoord 6

glob()heeft voorzieningen voor sorteren en patroonherkenning. Omdat de geretourneerde waarde een array is, kun je de meeste andere dingen doen die je nodig hebt.


Antwoord 7

Voor de volledigheid (aangezien dit een pagina met veel verkeer lijkt te zijn), laten we de goede oude dir()functie:

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired
print_r($entries);

Antwoord 8

Meestal kan ik me voorstellen dat je .en ..wilt overslaan. Hier is dat met
recursie:

<?php
$rdi = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS);
$rii = new RecursiveIteratorIterator($rdi);
foreach ($rii as $di) {
   echo $di->getFilename(), "\n";
}

https://php.net/class.recursivedirectoryiterator


Antwoord 9

u kunt dit ook doen

$path = "/public";
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $name => $object) {
  if ('.' === $object) continue;
  if ('..' === $object) continue;
str_replace('/public/', '/', $object->getPathname());
// for example : /public/admin/image.png => /admin/image.png

Other episodes