PHP-скрипт для перегляду всіх файлів у каталозі?


131

Я шукаю скрипт PHP, який перебирає всі файли в каталозі, щоб я міг робити такі файли з назвою файлу, як формат, друкувати або додавати його до посилання. Я хотів би мати можливість сортувати файли за іменем, типом або за датою створення / додавання / модифікації. (Подумайте, фантазійний каталог "індекс".) Я також хотів би мати можливість додавати виключення до списку файлів, таких як сам сценарій або інші "системні" файли. (Як .і .."каталоги".)

Оскільки я хотів би змінити сценарій, мені більше цікаво переглядати документи PHP та навчитися писати його сам. Однак, якщо є якісь сценарії, підручники та інше, будь ласка, дайте мені знати.


Відповіді:


245

Ви можете використовувати DirectoryIterator . Приклад з php керівництва:

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

3
Примітка: на багатьох серверах не встановлено SPL, тому ви не зможете використовувати клас DirectoryIterator (див. Мою альтернативну публікацію нижче). Використовуйте це, якщо можете, хоч!
NexusRex

4
Примітка [2]: Переконайтеся, що ви розумієте, що dirname()вищевказана функція отримає батьківську папку будь-якого шляху, який ви туди вкладете. У моєму випадку я припустив, що dirname є обгорткою для імені / шляху каталогу, тому він не потрібен.
willdanceforfun

Крім того, якщо dirname - це велика файлова система, проблеми з пам'яттю очевидні. У моєму випадку з 1 мільйонами файлів, програмі потрібно ~ 512 млн оперативної пам’яті на пам’яті_ліміт.
абкрим

1
Якщо вам потрібен повний шлях на зразок /home/examples/banana.jpgвикористання$fileinfo->getPathname()
mgutt

Ви можете використовувати! $ Fileinfo-> isDir (), щоб уникнути дії на каталоги
LeChatNoir

44

Якщо у вас немає доступу до класу DirectoryIterator, спробуйте це:

<?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);
}
?>

4
Чи можете ви назвати ситуацію, коли ви не мали б до неї доступу?
Йохем Куджперс

12
Багато застарілих додатків використовують PHP 4, який не має доступу до DirectoryIterator.
Джозеф Каллаарс

1
Чому "." === $ файл? Це не Java.
Дейв Хек

2
Дейв ... Немає, що вона відповідає точкам і не продовжується, якщо вона не відповідає PHP. Шукайте різницю між == та ===.
JSG

22

Використовуйте 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);
?>

18

Ви також можете скористатися FilesystemIterator. Він вимагає ще менше коду DirectoryIterator, а потім автоматично видаляє .та ...

// 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)

Посилання: http://php.net/manual/en/class.filesystemiterator.php


5

Ви можете використовувати цей код в циклі через каталог рекурсивно :

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

2

glob () має положення для сортування та відповідності шаблону. Оскільки повернене значення є масивом, ви можете робити більшість всього іншого, що вам потрібно.


1
Це добре, якщо ви не маєте багато файлів ...> 10 000. У вас не вистачить пам’яті.
NexusRex

@NexusRex: Ви також не повинні читати 10000 записів із бази даних, але це не вдається, що стосується питання
bcosca

Домовились! Якщо ви читаєте з бази даних, то ви можете застосувати "обмеження" на сторінках - немає такої удачі, коли у вас є каталог з 5 мільйонами XML-файлів, який можна повторити.
NexusRex

Є SPL GlobIterator.
przemo_li

2

Для повноти (оскільки це, здається, сторінка з високим трафіком), не забуваймо стару добру dir()функцію :

$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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.