PHP: Как я могу захватить один файл из каталога без сканирования всего каталога?

У меня есть каталог с 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.

удачи 🙂