我有这个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>";
}
}
Run Code Online (Sandbox Code Playgroud)
这是显示我的目录结构并将目录和文件名插入数据库(删除前2个字符..).
由于RecursiveDirectoryIterator遍历所有目录中的所有文件,如何排除整个目录,包括其中的所有文件?
Lev*_*son 20
从本质上讲,我的回答与托马斯的答案没有多大区别.但是,他没有得到一些正确的答案:
RecursiveCallbackFilterIterator要求您返回true递归到子目录..和..每个子目录内的目录in_array支票并不完全符合他的预期所以,我写了这个答案.假设我理解你想要的东西,这将正常工作:
编辑:他已修复了这三个问题中的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
}
Run Code Online (Sandbox Code Playgroud)
ThW*_*ThW 11
我建议使用RecursiveCallbackFilterIterator.
$directory = '../admin/';
$filter = array('.git');
$fileinfos = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$directory,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
}
)
);
foreach($fileinfos as $pathname => $fileinfo) {
//...
}
Run Code Online (Sandbox Code Playgroud)