【问题标题】:Exclude hidden files from scandir从 scandir 中排除隐藏文件
【发布时间】:2012-01-21 21:15:10
【问题描述】:

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

$files = scandir($imagepath);

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

【问题讨论】:

标签: php scandir hidden-files


【解决方案1】:

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

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

【讨论】:

  • 请注意 preg_grep 返回的数组保留了输入数组的键。要重置它们,您可以将 array_values 应用于结果数组。
  • $files = array_diff(scandir("path/of/dir"),array(".",".."));简单而甜蜜:D
  • @RajeshPrasadYadav 您将保留隐藏文件,如 .htaccess 等。
【解决方案2】:

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

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

【讨论】:

  • 澄清一下,isDot() 不会忽略以. 开头的文件。刚刚在我的系统 PHP 5.3.5 上试过。
  • 这个答案是错误的。 Unix 上的“点文件”或“隐藏文件”是名称以点开头的任何 文件。但是,根据the documentationisDot 仅在文件为... 时匹配。快速测试确认它不会匹配大多数点文件。
【解决方案3】:
$files = array_diff(scandir($imagepath), array('..', '.'));

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

可能比

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

【讨论】:

    【解决方案4】:
    function nothidden($path) {
        $files = scandir($path);
        foreach($files as $file) {
            if ($file[0] != '.') $nothidden[] = $file;
            return $nothidden;
        }
    }
    

    只需使用此功能

    $files = nothidden($imagepath);
    

    【讨论】:

    • 如果你不想使用preg_grep 因为正则表达式会吓到你,this 是要走的路 - 检查文件名是否以 的点开头获取第一个字符并检查它是否是一个点。这不是火箭科学,但也没有必要。此处其他一些答案使用的涉及字符串函数的“更聪明”的咒语,除了效率低下或错误之外,比这种方法不必要地复杂。
    【解决方案5】:

    我遇到了一个来自 php.net 的评论,专门针对 Windows 系统:http://php.net/manual/en/function.filetype.php#87161

    出于存档目的在此引用:

    我在 Windows Vista 上使用 PHP 的 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 操作系统。

    【讨论】:

      【解决方案6】:

      我认为因为您正在尝试“过滤”隐藏文件,这样做更有意义并且看起来最好......

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

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

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案8】:

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

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

          现在您检查每个项目是否没有. 作为第一个字符,如果没有,它会像您一样回显。

          【讨论】:

          • 使用strpos检查文件名的第一个字符是否是一个点是不必要的复杂 - 而且效率低下,因为当你只关心一个字符时它会搜索整个字符串。此外,将文字 0 转换为 int 根本没有意义;它已经是一个。改用if ($file[0] != '.') {...}
          【解决方案9】:

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

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

          一行:

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

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              我仍在为 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>";
              }
              

              【讨论】:

              • 这是检查$fileName 是否以点开头的一种极其复杂的方法;我必须研究strstr 手册页才能理解您在这里所做的事情。它也坏了;这不仅会过滤掉以点开头的文件名,还会过滤掉根本没有点的文件名(因为在这种情况下,strstr 返回 FALSEstrlen(FALSE) 返回 0,小于 1。绝对有不需要这种复杂性;只需改用if ($fileName[0] == '.') continue
              猜你喜欢
              • 2015-07-29
              • 1970-01-01
              • 2021-03-08
              • 1970-01-01
              • 2021-07-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多