我试图以递归方式获取文件夹中的所有文件,但它看起来很愚蠢,
如果我使用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;
}
答案 0 :(得分:0)
虽然我不会将其描述为“一种真实的方式”,但我认为如果递归地递归调用dir2files
成员函数(使用{{1}),我将会得到更清晰的解决方案。管理目录是第一个线索):
QStack
更新:添加了限制递归深度和限制QStringList FileFind::dir2files(const QString& path)
{
QStringList files;
dir2fileshelper(path, files, 0);
return files;
}
void FileFind::dir2fileshelper(const QString& path,
QStringList& files,
int currentDepth)
{
static const int MAXIMUM_DEPTH = 40; // For example
if (currentDepth >= MAXIMUM_DEPTH)
{
qWarning("Maximum directory depth limit reached.");
return;
}
QDir directory(path);
QFileInfoList list = directory.entryInfoList(QDir::NoDotAndDotDot |
QDir::Dirs |
QDir::Files);
foreach (const QFileInfo& fileInfo, list)
{
if (fileInfo.isDir())
{
dir2fileshelper(fileInfo.absoluteFilePath(), files, currentDepth+1);
}
else
{
files << fileInfo.absoluteFilePath();
}
}
}
复制的代码。