Подтвердить что ты не робот

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

У меня есть каталог с 1,3 миллионами файлов, которые мне нужно переместить в базу данных. Мне просто нужно захватить одно имя файла из каталога БЕЗ сканирования всего каталога. Неважно, какой файл я захватил, поскольку я удалю его, когда закончим, а затем перейду к следующему. Это возможно? Все примеры, которые я могу найти, похоже, сканируют весь список каталогов в массив. Мне нужно только захватить один за раз для обработки... не 1,3 миллиона каждый раз.

4b9b3361

Ответ 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
    }
}
?>

readdir

Возвращает имя следующей записи в каталоге. Записи возвращаются в том порядке, в котором они хранятся в файловой системе.

Ответ 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.

удачи:)