Отримання імен усіх файлів у каталозі за допомогою PHP


87

З якихось причин я постійно отримую «1» для імен файлів із таким кодом:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

Коли я повторюю кожен елемент у $ results_array, я отримую купу "1", а не ім'я файлу. Як отримати назву файлів?


1
Існує кілька варіантів використання glob .
allnightgrocery


1
Проблема, яку мав плакат, полягала в тому, що призначення має дуже низький пріоритет, тому оператор '! ==' оцінюється спочатку, а двійковий результат цієї операції потім призначається $ файлу. Єдиним виправленням є використання ($ file = readdir ($ handle))! == FALSE "
Омн


з 69 голосів до 70. Я відчуваю себе як протилежність Хенку Муді
Чарлі

Відповіді:


167

Не турбуйтеся про open / readdir і використовуйте globзамість цього:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
Можливо, ви захочете обернути array_filter(..., 'is_file')навколо цього глобуса, оскільки питання вимагає файлів.
салата

23
Не всі імена файлів мають вигляд *.*: просто використовуйте *замість них.
jameshfisher

Як ми можемо отримати всі файли у списку розширень? Наприклад, якщо ми хочемо всі файли .php та .js?
Ніш,

3
Так, ця відповідь не дуже надійна. Файли не повинні мати розширень, і каталоги можуть бути названі something.something. Краще використовувати array_filterі glob($log_directory.'/*').
Ендрю

Я підтримав цю пропозицію, оскільки мені просто потрібна була проста відповідь, і всі відповідні файли для мого випадку будуть *.*. Більш надійний вираз зробить це ще кращою відповіддю.
TecBrat

49

Стиль SPL :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

Перевірте списки доступних методів, які ви можете використовувати, у класах DirectoryIterator та SplFileInfo .


Чудовий спосіб отримати лише файли та лише їх імена замість усього шляху, дякую!
Кріс

1
Так. Для повних шляхів ви можете використовувати getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ілія

18

Потрібно оточити $file = readdir($handle)дужками.

Ось:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

Оскільки прийнята відповідь має два важливі недоліки, я публікую вдосконалену відповідь для тих, хто шукає правильної відповіді:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Потрібно відфільтрувати globeрезультати функції за допомогою is_file, оскільки це може також повернути деякі каталоги.
  2. Не всі файли мають .імена в іменах, тому */*шаблон взагалі відстій.

Це чисте виконання, яке спрацювало для мене. Попередні відповіді показали каталоги в результатах, яких я не хотів.
AWP

Вам, сер, потрібно більше голосів! Насправді (у вікнах) мені довелося використовувати, basename($file)щоб отримати лише ім'я файлу замість цілого шляху з ім'ям файлу.
Паулуко

10

У мене є менший код для цього:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

Повертає мені всі файли, крім двох сміттєвих файлів з іменем "." і "..". У мене немає жодного файлу з назвою "." і ".." у моєму каталозі.
kamranbhatti585

1
Використовуйте $ files = array_diff (scandir ($ path), array ('.', '..')); звільнити помилки, про які я вже говорив.
kamranbhatti585

Приємно. як видалити розширення для файлів? (Мені потрібно видалити .phpкожен файл.)
KSPR

8

У деяких ОС ви отримуєте . ..і .DS_Store, ну, ми не можемо їх використовувати, тож давайте їх приховувати

Спочатку почніть отримувати всю інформацію про файли, використовуючи scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

Це пов’язано з доцільністю оператора. Спробуйте змінити його на:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()та FilesystemIteratorприклади:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

Ви можете просто спробувати scandir(Path)функцію. це швидко і легко здійснити

Синтаксис:

$files = scandir("somePath");

Ця функція повертає список файлів у масив.

щоб переглянути результат, можна спробувати

var_dump($files);

Або

foreach($files as $file)
{ 
echo $file."< br>";
} 



0

Я просто використовую цей код:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

Рекурсивний код для вивчення всього файлу, що міститься в каталозі ('$ path' містить шлях до каталогу):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.