我正在尝试向Intranet添加功能,这将允许用户登录到Intranet,并访问存储在Windows网络SAN中的文档。
目前,我已成功检索到指定用户“我的文档”中的所有文件和文件夹名称。
我无法从阵列中删除隐藏的文件和文件夹。
目前,我可以删除以.
开头的所有文件夹和文件。
但是在Windows上,它们在属性中被标记为“隐藏”。我已经google了,发现了很多关于如何将文件标记为隐藏的资源,以及如何隐藏以.
开头的文件,但没有关于如何删除隐藏的Windows文件/文件夹的文件。 stackoverflow上的一篇文章提到使用DirectoryIterator,但目前还没有解释如何使用它来检查文件是否标记为隐藏。
我们有超过1000个用户,大约500MB - 1GB的文档,有多层目录,所以它需要相对较快。
澄清:
在Windows系统上的递归迭代期间,如何在不依赖前置.
符号的情况下查明目录是否隐藏?
答案 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')
函数扫描当前目录中的所有隐藏文件和文件夹。
然后它会将结果存储在一个数组中,并确保正在读取的当前文件/目录不在该数组中。