Haal de bestanden in een map

Hoe krijg ik de bestandsnamen in een map met PHP?

Ik kon de relevante opdracht niet vinden met Google, dus ik hoop dat deze vraag degenen zal helpen die soortgelijke vragen stellen.


Antwoord 1, autoriteit 100%

Er zijn veel manieren. De oudere manier is scandirmaar DirectoryIteratoris waarschijnlijk de beste manier.

Er is ook readdir(te gebruiken met opendir) en glob.

Hier zijn enkele voorbeelden van hoe u ze allemaal kunt gebruiken om alle bestanden in de huidige map af te drukken:

DirectoryIteratorgebruik: (aanbevolen)

foreach (new DirectoryIterator('.') as $file) {
    if($file->isDot()) continue;
    print $file->getFilename() . '<br>';
}

scandirgebruik:

$files = scandir('.');
foreach($files as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}

opendiren readdirgebruik:

if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if($file == '.' || $file == '..') continue;
        print $file . '<br>';
    }
    closedir($handle);
}

globgebruik:

foreach (glob("*") as $file) {
    if($file == '.' || $file == '..') continue;
    print $file . '<br>';
}

Zoals vermeld in de opmerkingen, is globleuk omdat de asterisk die ik daar heb gebruikt, daadwerkelijk kan worden gebruikt om overeenkomsten te maken met de bestanden, dus glob('*.txt')zou je alle tekstbestanden in de map geven en glob('image_*')zou je alle bestanden geven die beginnen met image_


Antwoord 2, autoriteit 15%

Het antwoord van Paolo Bergantinowas prima, maar is nu achterhaald!
Overweeg de onderstaande officiële manieren om de bestanden in een map te krijgen.


FilesystemIterator

FilesystemIteratorheeft veel nieuwe functies vergeleken met zijn voorouder DirectoryIterator, zoals de mogelijkheid om de instructie if($file->isDot()) continue;. Zie ook de vraag Verschil tussen DirectoryIteratoren FilesystemIterator.

$it = new FilesystemIterator(__DIR__);
foreach ($it as $fileinfo) {
    echo $fileinfo->getFilename() , PHP_EOL;
}

RecursiveDirectoryIterator

Dit fragment geeft een overzicht van PHP-bestanden in alle submappen.

$dir   = new RecursiveDirectoryIterator(__DIR__);
$flat  = new RecursiveIteratorIterator($dir);
$files = new RegexIterator($flat, '/\.php$/i');
foreach($files as $file) {
    echo $file , PHP_EOL;
}

Zie ook het Wrikken’s antwoord.


Antwoord 3, autoriteit 2%

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

<?php
$o_dir = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS);
$o_iter = new RecursiveIteratorIterator($o_dir);
foreach ($o_iter as $o_name) {
   echo $o_name->getFilename();
}

https://php.net/class.recursivedirectoryiterator


Antwoord 4

De oude manier zou zijn:

<?php
    $path = realpath('.'); // put in your path here
    $dir_handle = @opendir($path) or die("Unable to open $path");
    $directories = array();
    while ($file = readdir($dir_handle)) 
        $directories[] = $file;
    closedir($dir_handle);
?>

Zoals reeds vermeld is de directory-iterator wellicht de betere manier voor PHP 5.

Other episodes