PHP隐藏目录 - Windows

时间:2014-03-10 11:06:50

标签: php windows hidden-files

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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;
}

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

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

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