php scandir()是否在Windows下排除隐藏文件?

时间:2015-05-17 18:38:25

标签: php windows scandir hidden-files

在Windows系统上,备份代理创建了与原始文件几乎相同名称的临时隐藏文件,并且位于同一路径中。这可能会扰乱使用PHP scandir()的进程。

现在我想知道在PHP scandir()中是否排除了具有隐藏标志集的Windows上的文件。

有一些关于Linux风格的隐藏文件的文章,scandir()应该如何忽略以点开头的文件,但很少有关于Windows文件的信息。

2 个答案:

答案 0 :(得分:4)

我在Windows 7和Windows 8& 8.1和 它肯定会通过标记它们来排除隐藏文件。

   <?php

    $location="path/to/a/folder/";

    if( function_exists("scandir") ){

        $file = scandir($location);

        foreach($file as $this_file) {
        /***Putting the condition here restricts hidden files and files starting with '.' and '~'...****/
            if (is_hidden_file($location.$this_file) || $this_file == '.' || $this_file == '..' || $this_file[0]=='.' || $this_file[0]=='~' ) 
                continue;

            else {
            var_dump($this_file);
            }

        }       
    }

    function is_hidden_file($fn) {
        $dir = "\"".$fn."\"";
        $attr = trim(shell_exec("FOR %A IN (".$dir.") DO @ECHO %~aA"));
        if($attr[3] === 'h')
            return true;

        return false;
    }
?>

我发现您在问题中提到有一些方法可以排除以&#39;开头的文件。&#39;在linux中的东西,但关于Windows的信息非常少。然后检查它,它不仅消除了以&#39;开头的文件。&#39; &安培; &#39; ..&#39;但也标出了实际隐藏的文件,并且肯定会在Windows中运行。

答案 1 :(得分:1)

简短的测试表明,scandir()glob()或其他人都没有处理隐藏的旗帜。

以下是实验和结果:

enter image description here

件:

  • Windows 7
  • PHP 5.6.9(x86)
  • Visual Studio 2012 Redistributable x86

因此scandir()不会隐藏设置了隐藏标志的文件。

接下来的问题是,可以配置更强大的PHP命令,如glob()

首先,没有参数来处理标志:

http://php.net/manual/de/function.glob.php

其次,Gabriel S. Luraschi的这句话很有说服力:

http://php.net/manual/de/function.glob.php#110510

他建议exec('dir ... \A ...')。但是在商业主机上(如果它们在Windows上运行),这是不允许的。

要确定:使用Linux样式并忽略以点开头的文件,例如:

Exclude hidden files from scandir