【问题标题】:PHP hidden directories - WindowsPHP 隐藏目录 - Windows
【发布时间】:2014-03-10 11:06:49
【问题描述】:

我正在尝试向我们的 Intranet 添加一项功能,该功能将允许用户登录到 Intranet,并访问存储在 Windows 网络 SAN 中的文档。

目前,我已成功检索到指定用户“我的文档”中的所有文件和文件夹名称。

我很难从阵列中删除隐藏文件和文件夹。 目前,我可以删除所有以. 开头的文件夹和文件。

但是在 Windows 上,它们在属性中被标记为“隐藏”。我用谷歌搜索并找到了很多关于如何将文件标记为隐藏以及如何隐藏以. 开头的文件的资源,但没有关于如何删除隐藏的 Windows 文件/文件夹的资源。 stackoverflow 上的一篇文章提到使用 DirectoryIterator,但目前,还没有解释如何使用它来检查标记为隐藏的文件。

我们有超过 1000 个用户,大约有 500MB - 1GB 的文档,有多层目录,所以它需要相对较快。

澄清: 在 Windows 系统上的递归迭代过程中,如何在不依赖前置 . 符号的情况下找出目录是否隐藏?

【问题讨论】:

    标签: php windows hidden-files


    【解决方案1】:

    好的,在exec() 函数的帮助下成功了,所以请小心使用! 我正在使用 CodeIgniter,所以我稍微修改了 directory_helper.php 函数,因为它安装在 Windows 盒子上,它总是需要检查隐藏文件,但它也应该适用于非 codeigniter 站点:

    function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE)
    {
        if ($fp = @opendir($source_dir))
        {
            if(!$hidden)
            {
                $exclude = array();
                exec('dir "' . $source_dir . '" /ah /B', $exclude);
            }
    
            $filedata   = array();
            $new_depth  = $directory_depth - 1;
            $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
    
            while (FALSE !== ($file = readdir($fp)))
            {
                // Remove '.', '..', and hidden files [optional]
                if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.') OR ($hidden === FALSE && in_array($file, $exclude)))
                {
                    continue;
                }
    
                if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file))
                {
                    $filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden);
                }
                else
                {
                    $filedata[] = $file;
                }
            }
    
            closedir($fp);
            return $filedata;
        }
    
        return FALSE;
    }
    

    这在大约 11 秒内扫描了 2207 个文件和 446 个文件夹(我知道的年龄,但我能做到的最好)。在 500 个文件夹和 200 个文件上进行了测试,大约 3 秒就完成了。

    它是一个递归函数,它将扫描每个非隐藏目录。它做的第一件事是使用exec('dir *directory* /ah /B') 函数扫描当前目录中的所有隐藏文件和文件夹。

    然后它将结果存储在一个数组中,并确保当前正在读取的文件/目录不在该数组中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多