如何使用QDirIterator跳过文件夹? 我已经尝试过:
QString nameFilter = "*.h";
QDirIterator dirIterator(folder, nameFilter, QDir::Files, QDirIterator::Subdirectories);
QString str("folder");
QStringList filenames;
while (dirIterator.hasNext())
{
if(dirIterator.next() == str) continue;
filenames.append(dirIterator.next());
}
,但它仅忽略特定文件夹,而不忽略其子目录。 有想法吗?
答案 0 :(得分:1)
下面的指令可以100%工作:
此方法QString QDirIterator::next()
将迭代器前进到下一个条目,并返回此新条目的“文件路径”。如果hasNext()
返回false
,则此函数不执行任何操作,并返回null QString
。
如果QDirIterator
找到了具有特定filter
(基于const QStringList &nameFilters
参数的文件)的文件,则QDirIterator::next()
返回“ file-path”,您将无法比较整个“ file-路径”和“跳过文件夹”进行迭代!
因此,我不得不像下面这样写一个函数作为目录解析器:
QStringList Widget::getCurrDirsOfFile(const QFileInfo &file_info, const QString &default_folder)
{
QString file_path = file_info.filePath();
QString file_name = file_info.fileName();
file_path.truncate(file_path.lastIndexOf("/" + file_name));
file_path = file_path.mid(file_path.lastIndexOf("/") + 1);
return file_path;
}
此函数获取“文件路径”,并像下面这样返回其最后一个“文件夹名称”:
input : /home/msi/Desktop/123/untitled/123/widget.h
output(list) : 123, 123
我们有QString skiped_dir("untitled");
个跳过的文件夹!
在这种状态下,当您获得123
“文件夹名称”之外的内容时,可以将该文件附加到QStringList filenames
上:
if(folder_list.indexOf(QRegExp(skiped_dir)) == -1)
filenames.append(it.filePath());
所以尝试一下(注释中的提示):
void Widget::btn_iterate_clicked()
{
// folder to iterate
QString folder("/home/msi/Desktop/");
// folder-name you want to skip
QString skiped_dir("untitled");
// file-names which are match with .h filter stored in filenames list
QStringList filenames;
// this list used in QStringList getCurrDirsOfFile() method
QStringList folder_list;
// iterator
QDirIterator it(folder, QStringList() << "*.h" , QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext()) // if next object exist for iterate
{
// we have the file with .h extension
it.next();
// get previous folders that exist in filepath address of it.fileInfo()
folder_list = getCurrDirsOfFile(it.fileInfo(), folder);
// if folder_list contained skiped folder then reject that or appent it
if(folder_list.indexOf(QRegExp(skiped_dir)) == -1)
filenames.append(it.filePath());
}
for(int i = 0;i < filenames.count();i++)
{
QMessageBox::information(this, "", filenames.at(i));
}
}
假设我们有波纹树(目录):
该程序仅显示:
/home/msi/Desktop/build-untitled-Desktop_Qt_5_0_2_GCC_64bit-Debug/ui_widget.h
/home/msi/Desktop/1/1.h
答案 1 :(得分:0)
我知道这有点旧,但是您的原始代码已经关闭了……有两个问题。首先,迭代器覆盖每个条目,返回的是完整路径和文件名,而不仅仅是当前目录中的条目名称。问题是检查精确匹配而不是遏制问题。第二个问题是您有两个调用“ next”的调用,而没有在它们之间调用“ hasNext”的调用,因此很可能会崩溃。
while (dirIterator.hasNext())
{
QString fname = dirIterator.next ();
if (fname.contains (str)) continue;
filenames.append (fname);
}
请注意,您可能需要更具体地使用“ str”的值。任何文件名都可以包含“ folder”一词,因此您可能要检查str.endsWith(“ / folder”)和str.contains(“ / folder/")。
如果您检查从“ next”返回的值,则最好查看如何将排除的内容与当前条目进行比较,因此只需调整字符串比较即可获得所需的内容。