У меня есть каталог с 1,3 миллионами файлов, которые мне нужно переместить в базу данных. Мне просто нужно захватить одно имя файла из каталога БЕЗ сканирования всего каталога. Неважно, какой файл я захватил, поскольку я удалю его, когда закончим, а затем перейду к следующему. Это возможно? Все примеры, которые я могу найти, похоже, сканируют весь список каталогов в массив. Мне нужно только захватить один за раз для обработки … не 1,3 миллиона каждый раз.
Это должно сделать это:
<?php $h = opendir('./'); //Open the current directory while (false !== ($entry = readdir($h))) { if($entry != '.' && $entry != '..') { //Skips over . and .. echo $entry; //Do whatever you need to do with the file break; //Exit the loop so no more files are read } } ?>
READDIR
Возвращает имя следующей записи в каталоге. Записи возвращаются в том порядке, в котором они хранятся в файловой системе.
Просто получите итератор каталогов и найдите первую запись, которая является файлом:
foreach(new DirectoryIterator('.') as $file) { if ($file->isFile()) { echo $file, "\n"; break; } }
Это также гарантирует, что ваш код будет выполнен в другом поведении файловой системы, чем тот, который вы ожидаете.
См. DirectoryIterator
и SplFileInfo
.
readdir сделает трюк. Проверьте пример на этой странице, но вместо выполнения вызова readdir в цикле просто выполните его один раз. Вы получите первый файл в каталоге.
Примечание: вы можете получить «.», «..» и другие подобные ответы в зависимости от сервера, поэтому вам может понадобиться хотя бы цикл, пока не получите действительный файл.
вы хотите вернуть первый каталог или первый файл? и то и другое? использовать это:
создать функцию «pickfirst» с 2 аргументами (адрес и режим dir или файл?)
function pickfirst($address,$file) { // $file=false >> pick first dir , $file=true >> pick first file $h = opendir($address); while (false !== ($entry = readdir($h))) { if($entry != '.' && $entry != '..' && ( ($file==false && !is_file($address.$entry)) || ($file==true && is_file($address.$entry)) ) ) { return $entry; break; } } // end while } // end function
если вы хотите выбрать первую директорию в своем адресе, установите $file
в false, и если вы хотите выбрать первый файл в своем адресе, установите $file
в true.
удачи 🙂