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 scandir
maar DirectoryIterator
is 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:
DirectoryIterator
gebruik: (aanbevolen)
foreach (new DirectoryIterator('.') as $file) {
if($file->isDot()) continue;
print $file->getFilename() . '<br>';
}
scandir
gebruik:
$files = scandir('.');
foreach($files as $file) {
if($file == '.' || $file == '..') continue;
print $file . '<br>';
}
opendir
en readdir
gebruik:
if ($handle = opendir('.')) {
while (false !== ($file = readdir($handle))) {
if($file == '.' || $file == '..') continue;
print $file . '<br>';
}
closedir($handle);
}
glob
gebruik:
foreach (glob("*") as $file) {
if($file == '.' || $file == '..') continue;
print $file . '<br>';
}
Zoals vermeld in de opmerkingen, is glob
leuk 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
FilesystemIterator
heeft veel nieuwe functies vergeleken met zijn voorouder DirectoryIterator
, zoals de mogelijkheid om de instructie if($file->isDot()) continue;
. Zie ook de vraag Verschil tussen DirectoryIterator
en 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.