У меня есть каталог с 1,3 миллионами файлов, которые мне нужно переместить в базу данных. Мне просто нужно захватить одно имя файла из каталога БЕЗ сканирования всего каталога. Неважно, какой файл я захватил, поскольку я удалю его, когда закончим, а затем перейду к следующему. Это возможно? Все примеры, которые я могу найти, похоже, сканируют весь список каталогов в массив. Мне нужно только захватить один за раз для обработки... не 1,3 миллиона каждый раз.
PHP: Как я могу захватить один файл из каталога без сканирования всего каталога?
Ответ 1
Это должно сделать это:
<?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
}
}
?>
Возвращает имя следующей записи в каталоге. Записи возвращаются в том порядке, в котором они хранятся в файловой системе.
Ответ 2
Просто получите итератор каталогов и найдите первую запись, которая является файлом:
foreach(new DirectoryIterator('.') as $file)
{
if ($file->isFile()) {
echo $file, "\n";
break;
}
}
Это также гарантирует, что ваш код будет выполнен по другому поведению в файловой системе, чем тот, который вы ожидаете.
См. DirectoryIterator
и SplFileInfo
.
Ответ 3
readdir будет делать трюк. Проверьте пример на этой странице, но вместо выполнения вызова readdir в цикле просто выполните его один раз. Вы получите первый файл в каталоге.
Примечание: вы можете получить ".", ".." и другие подобные ответы в зависимости от сервера, поэтому вам может понадобиться по крайней мере цикл, пока вы не получите действительный файл.
Ответ 4
Вы хотите вернуть первый каталог или первый файл? и то и другое? используйте это:
создать функцию "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.
удачи:)