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

时间:2012-05-17 20:08:38

标签: php file directory

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

4 个答案:

答案 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;
    }        
}

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

请参阅DirectoryIteratorSplFileInfo

答案 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。

祝你好运:)

相关问题