15

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

4

4 回答 4

20

这应该这样做:

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

读目录

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

于 2012-05-17T20:14:04.117 回答
5

只需获取目录迭代器并查找作为文件的第一个条目:

foreach(new DirectoryIterator('.') as $file)
{
    if ($file->isFile()) {
        echo $file, "\n";
        break;
    }        
}

这也确保您的代码在某些其他文件系统行为上执行,而不是您期望的行为。

DirectoryIteratorSplFileInfo

于 2012-05-18T11:39:00.663 回答
2

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

注意:您可能会收到“.”、“..”和其他类似的响应,具体取决于服务器,因此您可能希望至少循环直到获得有效文件。

于 2012-05-17T20:11:39.750 回答
0

你想返回第一个目录还是第一个文件?两个都?用这个:

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

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。

祝你好运 :)

于 2014-03-11T19:49:33.880 回答