Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何在不扫描整个目录的情况下从目录中获取单个文件?_Php_File_Directory - Fatal编程技术网

PHP:如何在不扫描整个目录的情况下从目录中获取单个文件?

PHP:如何在不扫描整个目录的情况下从目录中获取单个文件?,php,file,directory,Php,File,Directory,我有一个包含130万个文件的目录,我需要将这些文件移动到数据库中。我只需要从目录中获取一个文件名,而不必扫描整个目录。我抓取哪个文件并不重要,因为我会在处理完后删除它,然后继续下一个文件。这可能吗?我能找到的所有示例似乎都将整个目录列表扫描到一个数组中。我只需要一次抓取一个来处理。。。不是每次130万。就行了。检查该页面上的示例,但不要在循环中执行readdir调用,只需执行一次即可。您将获得目录中的第一个文件 注意:根据服务器的不同,您可能会得到“.”“…”和其他类似的响应,因此您可能希望至少

我有一个包含130万个文件的目录,我需要将这些文件移动到数据库中。我只需要从目录中获取一个文件名,而不必扫描整个目录。我抓取哪个文件并不重要,因为我会在处理完后删除它,然后继续下一个文件。这可能吗?我能找到的所有示例似乎都将整个目录列表扫描到一个数组中。我只需要一次抓取一个来处理。。。不是每次130万。

就行了。检查该页面上的示例,但不要在循环中执行readdir调用,只需执行一次即可。您将获得目录中的第一个文件

注意:根据服务器的不同,您可能会得到“.”“…”和其他类似的响应,因此您可能希望至少循环一次,直到获得有效的文件。

这应该可以做到:

<?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
    }
}
?>

返回目录中下一个条目的名称。条目按文件系统存储的顺序返回


只需获取目录迭代器并查找第一个条目,即文件:

foreach(new DirectoryIterator('.') as $file)
{
    if ($file->isFile()) {
        echo $file, "\n";
        break;
    }        
}
这还可以确保您的代码在其他文件系统行为上执行,而不是在您期望的行为上执行


请参阅和。

要返回第一个目录还是第一个文件?二者都使用以下命令:

创建带有2个参数的函数“pickfirst”(地址和模式目录或文件?)

如果要在地址集中选择第一个目录,请将
$file
设置为false,如果要在地址集中选择第一个文件,请将
$file
设置为true


祝你好运:)

@JonathanSampson我怀疑他是否关心文件名。他想抓取任何文件,将其放入数据库,然后移动到下一个。我宁愿在数据库中插入“.”和“…”,也不愿检查130万次。@SamyDindane,检查不会花费太长时间,特别是与从磁盘读取文件并将其存储在数据库中相比……不过,开销还是可以避免的(每一点都有帮助)只需在循环之前运行两个对
readdir
的调用,就像
一样。
始终是第一个条目。@Zombaya的确,这不需要时间。我在我的电脑上试过:用了200毫秒运行
if($entry!='.&&&$entry!='..'){}
130万次。令人惊讶。如果一个目录条目是不需要的,比如另一个目录或符号链接等等,那么这段代码就有一个大问题。这不是将整个目录内容加载到一个数组中吗?这就是凯尔试图避免的。当文件夹中有数千个文件时,这可能会有所不同。@skibulk:不,它不会在DirectoryIterator上进行迭代,DirectoryIterator不是数组,而是对象。这可以有效地防止你害怕的事情:array.Cool。我习惯于
foreach
ing数组。所以当
foreach
访问
DirectoryIterator
的下一个索引时,它实际上是在调用一个方法(即getNextFile())?奇怪的是,你可以这样想。更准确地说,它调用的是PHP中
foreach
和。更清楚?
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