从scandir中排除隐藏文件

时间:2011-12-16 10:04:31

标签: php scandir hidden-files

我使用以下代码获取目录中的图像列表:

$files = scandir($imagepath);

$files还包含隐藏文件。我该如何排除它们?

11 个答案:

答案 0 :(得分:63)

在Unix上,您可以使用preg_grep过滤掉以点开头的文件名:

$files = preg_grep('/^([^.])/', scandir($imagepath));

答案 1 :(得分:5)

我倾向于使用DirectoryIterator这样的东西,它提供了一种忽略点文件的简单方法:

$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    $file =  $path.$fileInfo->getFilename();
}

答案 2 :(得分:4)

function nothidden($path) {
    $files = scandir($path);
    foreach($files as $file) {
        if ($file[0] != '.') $nothidden[] = $file;
        return $nothidden;
    }
}

只需使用此功能

$files = nothidden($imagepath);

答案 3 :(得分:1)

我在php.net上收到了一条评论,专门针对Windows系统:http://php.net/manual/en/function.filetype.php#87161

引用此处进行存档:

  

我在Windows Vista上使用CLI的CLI版本。以下是如何确定文件是否已标记为"隐藏"通过NTFS:

function is_hidden_file($fn) {

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));

    if($attr[3] === 'h')
        return true;

    return false;
}
     

if($attr[3] === 'h')更改为if($attr[4] === 's')将检查系统文件。

     

这适用于任何提供DOS shell命令的Windows操作系统。

答案 4 :(得分:1)

我估计,因为你正试图过滤'隐藏文件,它更有意义,看起来最好这样做...

$items = array_filter(scandir($directory), function ($item) {
    return 0 !== strpos($item, '.');
});

我也没有调用变量$files,因为它暗示它只包含文件,但实际上你也可以获取目录......在某些情况下:)

答案 5 :(得分:1)

使用preg_grep排除带有特殊字符的文件名,例如

$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));

http://php.net/manual/en/function.preg-grep.php

答案 6 :(得分:1)

$files = array_diff(scandir($imagepath), array('..', '.'));

$files = array_slice(scandir($imagepath), 2);

可能比

$files = preg_grep('/^([^.])/', scandir($imagepath));

答案 7 :(得分:0)

假设隐藏文件以.开头,您可以在输出时执行以下操作:

foreach($files as $file) {
    if(strpos($file, '.') !== (int) 0) {
        echo $file;
    }
}

现在你检查每个项目,如果没有.作为第一个字符,如果没有它,你会喜欢你回答。

答案 8 :(得分:0)

如果您想重置数组索引并设置顺序,请使用以下代码:

$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));

一行:

package.json

答案 9 :(得分:0)

scandir() 内置 函数,默认情况下也会选择隐藏文件, 如果您的目录只有。 &..隐藏文件,然后尝试选择文件

$files = array_diff(scandir("path/of/dir"),array(".","..")) //can add other hidden file if don't want to consider

答案 10 :(得分:-1)

我仍然留下了对于seegee解决方案的选中标记,我会在下面发表评论,对他的解决方案进行微调。

他的解决方案掩盖目录(。和..),但不掩盖像.htaccess

这样的隐藏文件

小调整可以解决问题:

foreach(new DirectoryIterator($curDir) as $fileInfo) {
    //Check for something like .htaccess in addition to . and ..
    $fileName = $fileInfo->getFileName();
    if(strlen(strstr($fileName, '.', true)) < 1) continue;

     echo "<h3>" . $fileName . "</h3>";
}