#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, '');
С помощью моей пользовательской функции я могу включить расширение или оставить его пустым. Кроме того, я могу забыть поместить . перед расширением, и оно будет успешным.