PHP: Как перечислить файлы в каталоге без перечисления подкаталогов

#php #file #list

#php #файл #Список

Вопрос:

Это начальная часть моего кода для перечисления файлов в каталоге:

 $files = scandir($dir); 
$array = array(); 
foreach($files as $file)
{
    if($file != '.' amp;amp; $file != '..' amp;amp; !is_dir($file)){
          ....
  

Я пытаюсь перечислить все файлы в каталоге без перечисления вложенных папок. Код работает, но показывает как файлы, так и папки. Я добавил !is_dir($file) , как вы видите в моем коде выше, но результаты все те же.

Ответ №1:

Я думаю, это должно быть так:

 $files = scandir($dir); 
foreach($files as $file)
{
    if(is_file($dir.$file)){
      ....
  

Комментарии:

1. Поскольку ‘.’ и ‘..’ являются каталогами, «$file != ‘.’ amp;amp; $file != ‘..’ amp;amp;» является избыточным в выражении. И завершающий разделитель каталогов не имеет значения.

Ответ №2:

Просто используйте is_file .

Пример:

 foreach($files as $file)
{
    if( is_file($file) )
    {
       // Something
    }
}
  

Комментарии:

1. Я мог бы, но для моего конкретного примера я хотел знать, почему is_dir() не работает. Спасибо 1

Ответ №3:

Это просканирует файлы, а затем проверит, находится ли . или .. в массиве. Затем нажмите файлы, исключая. и .. в массиве new files[].

Попробуйте это:

 $scannedFiles = scandir($fullPath);
$files = [];

foreach ($scannedFiles as $file) {
    if (!in_array(trim($file), ['.', '..'])) {
        $files[] = $file;
    }
}
  

Комментарии:

1. Здравствуйте, и добро пожаловать в StackOverflow. Пожалуйста, добавьте некоторые пояснения к коду.

Ответ №4:

Какая боль для чего-то, казалось бы, простого! У меня ничего не получалось… Чтобы получить результат, я предположил, что имя файла имеет расширение, которое оно должно иметь в моем случае.

 if ($handle = opendir($opendir)) {
    while (false !== ($entry = readdir($handle))) {
        $pos = strpos( $entry, '.' );
        if ($entry != "." amp;amp; $entry != ".." amp;amp; is_numeric($pos)  ) {
  

………… хорошая запись

Комментарии:

1. ну, вы указали на это, но все же есть повседневные файлы без точек в их именах.

Ответ №5:

Используйте DIRECTORY_SEPARATOR константу, чтобы добавить файл к его пути к каталогу.

     function getFileNames($directoryPath) {
        $fileNames = [];
        $contents = scandir($directoryPath);

        foreach($contents as $content) {
            if(is_file($directoryPath . DIRECTORY_SEPARATOR . $content)) {
                array_push($fileNames, $content);
            }
        }

        return $fileNames;
    }
  

Ответ №6:

Это быстрый и простой способ перечислить ТОЛЬКО файлы. Поскольку пользователь хочет перечислить только файлы, нет необходимости сканировать каталог и возвращать все содержимое и исключать каталоги. Просто получите файлы любого типа или определенного типа. Используйте *, чтобы вернуть все файлы независимо от расширения или получить файлы с определенным расширением, заменив * расширением.

Получить все файлы независимо от расширения:

 $files = glob($dir . DIRECTORY_SEPARATOR . "*");
  

Получить все файлы с расширением php:

 $files = glob($dir . DIRECTORY_SEPARATOR . "*.php");
  

Получить все файлы с расширением js:

 $files = glob($dir . DIRECTORY_SEPARATOR . "*.js");
  

Я использую следующее для своих сайтов:

 function fileList(string $directory, string $extension="") :array
{
    $filetype = '*';
    if(!empty($extension) amp;amp; mb_substr($extension, 0, 1, "UTF-8") != '.'):
        $filetype .= '.' . $extension;
    else:
        $filetype .= $extension;
    endif;
    return glob($directory . DIRECTORY_SEPARATOR . $filetype);
}
  

Использование :

 $files = fileList($configData->includesDirectory, '');
  

С помощью моей пользовательской функции я могу включить расширение или оставить его пустым. Кроме того, я могу забыть поместить . перед расширением, и оно будет успешным.