PHP List目录结构,并排除一些目录 [英] PHP List Directory structure and exclude some directories
问题描述
我有以下PHP代码:
$rootpath = '../admin/';
$inner = new RecursiveDirectoryIterator($rootpath);
$fileinfos = new RecursiveIteratorIterator($inner);
foreach ($fileinfos as $pathname => $fileinfo)
{
$pathname2 = substr($pathname,2);
$sql = "SELECT * from admin_permissions where page_name = '$pathname2'";
$rs = mysql_query($sql,$conn);
if (mysql_num_rows($rs) == 0)
{
if (!$fileinfo->isFile()) continue;
$sql2 = "INSERT into admin_permissions (page_name) values ('$pathname2')";
$rs2 = mysql_query($sql2,$conn);
echo "$pathname<br>";
}
}
这将显示我的目录结构,并将目录和文件名插入数据库中(删除前两个字符..
).
That is displaying my directory structure and inserting the directories and file names into a database (removing the first 2 characters ..
).
由于RecursiveDirectoryIterator
遍历所有目录中的所有文件,因此如何排除整个目录,包括其中的所有文件?
Since the RecursiveDirectoryIterator
iterates through all files in all directories, how can I exclude whole directories, including all files within them?
推荐答案
从本质上讲,我的回答与 Thomas 的答案.但是,他没有得到一些正确的答案:
In essence, my answer is not much different from Thomas' answer. However, he does not get a few things correct:
-
RecursiveCallbackFilterIterator
的正确语义要求您返回true
以递归到子目录中. - 他不会跳过每个子目录中的
.
和..
目录 - 他的
in_array
检查不完全符合他的期望
- The semantics correct for the
RecursiveCallbackFilterIterator
require you to returntrue
to recurse into subdirectories. - He doesn't skip the
.
and..
directories inside each sub-directory - His
in_array
check doesn't quite do what he expects
所以,我改写了这个答案.假设我了解您想要的内容,它将可以正常工作:
So, I wrote this answer instead. This will work correctly, assuming I understand what you want:
从那以后,他已经修复了这三个问题中的2个.由于他写条件支票的方式,第三种可能不是问题,但我不太确定.
<?php
$directory = '../admin';
// Will exclude everything under these directories
$exclude = array('.git', 'otherDirToExclude');
/**
* @param SplFileInfo $file
* @param mixed $key
* @param RecursiveCallbackFilterIterator $iterator
* @return bool True if you need to recurse or if the item is acceptable
*/
$filter = function ($file, $key, $iterator) use ($exclude) {
if ($iterator->hasChildren() && !in_array($file->getFilename(), $exclude)) {
return true;
}
return $file->isFile();
};
$innerIterator = new RecursiveDirectoryIterator(
$directory,
RecursiveDirectoryIterator::SKIP_DOTS
);
$iterator = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator($innerIterator, $filter)
);
foreach ($iterator as $pathname => $fileInfo) {
// do your insertion here
}
这篇关于PHP List目录结构,并排除一些目录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!