PHP scandir导致额外的文件

时间:2010-01-02 10:31:53

标签: php

为什么当我使用PHP使用scandir时我会得到额外的值

$portID = $this->id;
$dir = '/home/sites/mydomain.com/public_html/public/images/'.$portID;
$contents = scandir($dir);

是否有一些我不了解的函数产生的值多于文件夹中的实际值?

5 个答案:

答案 0 :(得分:3)

这是使用opendir

的替代方案
$dir = "/your/path";
if (is_dir($dir)) {
    if ($d = opendir($dir)) {
           while (($file = readdir($d)) !== false) {
                if ( $file != "."  && $file != ".." ){
                    echo "filename: $file \n";
                    $files[]=$file;
                }
           }
        closedir($d);
    }
}

如果你坚持使用scandir(),那么使用循环来浏览scandir()返回的文件数组,然后从数组中删除那些你不想要的文件

答案 1 :(得分:1)

我没有足够的代表来评论只是某人的答案,所以这必须在一个单独的答案中。从PHP 5.3开始,FilesystemIterator扩展了DirectoryIterator并默认跳过了点文件。

答案 2 :(得分:1)

这是摆脱点和不必要的文件或目录的最简单方法。

// remove unnecessary dots etc
$result = array_diff(scandir('/dir/to/scan/'), array('.', '..', '.DS_Store'));
print_r($result);

希望这有帮助。谢谢!

答案 3 :(得分:0)

虽然没有scandir()的实际输出很难分辨,但我猜你的意思是额外的...条目。

它们也出现在manual的示例中。您必须手动过滤掉它们。

.指的是当前目录 ..指的是父目录。

这个传统来自Unix世界,在这个历史上,我不知道。我想这是因为它允许您在ls的每次调用中快速查看当前目录和父目录的权限。

答案 4 :(得分:0)

Pekka的答案没有错;我将从SPL添加一个更具说明性和可模拟性的实现:

class DirectoryFilterDots extends RecursiveFilterIterator
{
    function __construct($path)
    {
        parent::__construct(new RecursiveDirectoryIterator($path));
    }

    function accept()
    {
        return !$this->getInnerIterator()->isDot();
    }

    function key()
    {
        return $this->getInnerIterator()->getPathname();
    }
}