1
我试图让所有的文件夹中,递归,但它看起来愚蠢,集名称仅过滤的文件,而不是在显示目录
如果我使用setNameFilters
,将过滤的文件夹名称为好,这样如果文件夹内没有文件,但只有子文件夹,则循环将失败。所以现在我正在做内部循环两次,一次是找到没有名称过滤器的所有子文件夹;一个用于所有带名称过滤器的文件。
梳理它们的正确方法是什么?我想所有的文件夹,也应该符合过滤器(如果这是在循环中的文件或文件夹,我会判断)
QStringList FileFind::dir2files(const QString &path)
{
QStringList files;
QStack<QString> stack;
stack.push(path);
while (! stack.isEmpty())
{
QDir dir (stack.top());
stack.pop();
foreach (const QFileInfo & fileInfo,
dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs))
{
stack.push_back(fileInfo.absoluteFilePath());
}
dir.setNameFilters(_nameFilters);
foreach (const QFileInfo & fileInfo,
dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files))
{
files.append(fileInfo.absoluteFilePath());
}
}
return files;
}
如果我这样做,我不应该担心有限的堆栈大小(即限制递归深度)吗? – daisy
@ warl0ck是的,你可能会遇到一个非常深的目录树的堆栈溢出。处理它的唯一方法是要么坚持原来的实现(对于深层的目录树会使用大量内存,但希望不会崩溃),或者对递归深度设置限制(我已经编辑了我的答案显示这个)。这是您必须在可读性和资源使用关注点之间进行选择的领域之一。 –