0

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

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

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

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

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

澄清一下: 在 Windows 系统上的递归迭代期间,如何不依赖前置.符号来确定目录是否隐藏?

4

1 回答 1

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')功能扫描当前目录中的所有隐藏文件和文件夹。

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

于 2014-03-10T13:11:46.650 回答