Qt4 仅在文件上设置名称筛选器,而不在目录上设置名称筛选器
我试图递归地获取文件夹中的所有文件,但这看起来很愚蠢 如果我使用Qt4 仅在文件上设置名称筛选器,而不在目录上设置名称筛选器,qt4,Qt4,我试图递归地获取文件夹中的所有文件,但这看起来很愚蠢 如果我使用setNameFilters,它也会过滤文件夹名,因此如果文件夹中没有文件,只有子文件夹,循环就会失败。所以现在我做了两次内部循环,一次用于查找没有名称过滤器的所有子文件夹;一个用于具有名称筛选器的所有文件 梳理它们的正确方法是什么?我想要所有文件夹,以及所有符合过滤器的文件(我将判断它是循环中的文件还是文件夹) QStringList FileFind::dir2files(常量QString&path) { QStringLis
setNameFilters
,它也会过滤文件夹名,因此如果文件夹中没有文件,只有子文件夹,循环就会失败。所以现在我做了两次内部循环,一次用于查找没有名称过滤器的所有子文件夹;一个用于具有名称筛选器的所有文件
梳理它们的正确方法是什么?我想要所有文件夹,以及所有符合过滤器的文件(我将判断它是循环中的文件还是文件夹)
QStringList FileFind::dir2files(常量QString&path)
{
QStringList文件;
QStack堆栈;
stack.push(路径);
而(!stack.isEmpty())
{
QDir目录(stack.top());
stack.pop();
foreach(const QFileInfo和fileInfo,
目录入口信息列表(QDir::NoDotAndDotDot | QDir::Dirs))
{
stack.push_back(fileInfo.absoluteFilePath());
}
目录setNameFilters(_nameFilters);
foreach(const QFileInfo和fileInfo,
目录入口信息列表(QDir::NoDotAndDotDot | QDir::Files))
{
append(fileInfo.absoluteFilePath());
}
}
归还文件;
}
虽然我不会将此描述为“一种真正的方式”,但我认为如果递归调用dir2files
成员函数,您将得到一个更干净的解决方案(您使用QStack
管理目录是第一个线索):
QStringList FileFind::dir2files(常量QString&path)
{
QStringList文件;
dir2fileshelper(路径,文件,0);
归还文件;
}
void FileFind::dir2fileshelper(常量QString和path,
QStringList和文件,
int(当前深度)
{
static const int max_DEPTH=40;//例如
如果(当前深度>=最大深度)
{
qWarning(“已达到最大目录深度限制”);
返回;
}
QDir目录(path);
QFileInfoList=目录.entryInfoList(QDir::NodeAndDotDotDot |
QDir::Dirs|
QDir::文件);
foreach(const QFileInfo和fileInfo,列表)
{
if(fileInfo.isDir())
{
dir2fileshelper(fileInfo.absoluteFilePath(),文件,currentDepth+1);
}
其他的
{
如果我这样做,我不应该担心有限的堆栈大小(这会限制递归深度吗?@warl0ck是的,对于非常深的目录树,您可能会遇到堆栈溢出。唯一的处理方法是要么坚持原始实现(对于深目录树,这将使用大量内存,但希望不会崩溃)或者限制递归深度(我已经编辑了我的答案来说明这一点)。这是您必须在可读性和资源使用问题之间进行选择的领域之一。
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;
}
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();
}
}
}