我有一个包含130万个文件的目录,我需要将其移动到数据库中。我只需要从目录中获取单个文件名而不扫描整个目录。我抓住哪个文件并不重要,因为当我完成它之后我将删除它然后继续下一个。这可能吗?我能找到的所有示例似乎都将整个目录列表扫描成一个数组。我只需要一次抓一个进行处理......每次都不是130万。
答案 0 :(得分:19)
这应该这样做:
<?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 强>
返回目录中下一个条目的名称。这些条目按文件系统存储的顺序返回。
答案 1 :(得分:5)
只需获取目录迭代器并查找作为文件的第一个条目:
foreach(new DirectoryIterator('.') as $file)
{
if ($file->isFile()) {
echo $file, "\n";
break;
}
}
这还可以确保您的代码在某些其他文件系统行为上执行,而不是您期望的行为。
答案 2 :(得分:2)
readdir会做到这一点。检查该页面上的示例,但不要在循环中执行readdir调用,只需执行一次。您将获得目录中的第一个文件。
注意:根据服务器的不同,您可能会收到“。”,“..”和其他类似的响应,因此您可能希望至少循环直到获得有效文件。
答案 3 :(得分: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。