我有一个包含 130 万个文件的目录,我需要将这些文件移入数据库。我只需要从目录中获取一个文件名而不扫描整个目录。我抓取哪个文件并不重要,因为我会在完成后删除它,然后继续下一个。这可能吗?我能找到的所有示例似乎都将整个目录列表扫描到一个数组中。我只需要一次抓一个来处理……而不是每次130万。
问问题
7840 次
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;
}
}
这也确保您的代码在某些其他文件系统行为上执行,而不是您期望的行为。
于 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 回答