我正在尝试打印出目录中所有文件的文件名。但是有些文件没有显示或无法打开。
如果我重新启动程序,则实际上打开并显示以前无法打开的文件。 发生了什么事?
这是我的代码:
QDirIterator iterator(dir.absolutePath(), QDirIterator::Subdirectories);
while (iterator.hasNext()) {
iterator.next();
QFile file(iterator.next());
if ( file.open( QIODevice::ReadOnly ) ) {
qDebug() << QFileInfo(file).fileName() << endl;
} else {
qDebug() << "Can't open " << QFileInfo(file).fileName() << endl;
}
}
答案 0 :(得分:3)
这里有一个问题:
iterator.next();
QFile file(iterator.next());
if ( file.open( QIODevice::ReadOnly ) ) {
您正在尝试在循环内两次推进迭代器。这意味着您可能会循环遍历最后一个元素,该元素将代表一个无效文件,然后由于显而易见的原因而失败。
根据文件夹的内容,即下次运行是否稍微改变,即添加或删除一个文件,此循环可能会“下一次”工作,即它尝试打开的所有文件都将打开,但它仍然会跳过其形式的文件。
正确的解决方法是从迭代中删除此行:
iterator.next();
因此,为方便起见,您的整个代码就是这样:
QDirIterator iterator(dir.absolutePath(), QDirIterator::Subdirectories);
while (iterator.hasNext()) {
QFile file(iterator.next());
if ( file.open( QIODevice::ReadOnly ) )
qDebug() << "Opened:" << file.fileName() << endl;
else
qDebug() << "Can't open " << file.fileName() << file.errorString() << endl;
}
根据评论至少要注意两件事:
在这种情况下,您可以使用the errorString() method获取更多信息。
您无需构造QFileInfo来获取文件名。 QFile对象already has a method for that.。问题是您正在递归迭代,因此,您只打印出基本名称而不知道文件所在的位置。如果不同子目录中的文件具有相同名称,您也可以多次显示相同的文件名。
答案 1 :(得分:1)
为什么不使用QDir :: entryList?
来自Qt助理:
QStringList QDir :: entryList(const QStringList&amp; nameFilters,Filters filters = NoFilter,SortFlags sort = NoSort)const 返回目录中所有文件和目录的名称列表,根据先前使用setNameFilters()和setFilter()设置的名称和属性过滤器排序,并根据使用setSorting()设置的标志进行排序。
可以使用nameFilters,filters和sort参数覆盖名称过滤器,文件属性过滤器和排序规范。
如果目录不可读,不存在或者没有与规范匹配,则返回空列表。
另请参见entryInfoList(),setNameFilters(),setSorting()和setFilter()。 的