PHP List目录结构,并排除一些目录 [英] PHP List Directory structure and exclude some directories

查看:65
本文介绍了PHP List目录结构,并排除一些目录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下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 return true 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆