显示并读取目录下的所有文件
Display and read all files in directory
我试图打印出目录中所有文件的文件名。然而,有些文件不显示或无法打开。
如果我重新启动程序,以前无法打开的文件实际上被打开并显示。发生了什么事?
这是我的代码:
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;
}
}
这里有一个问题:
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;
}
至少有两点需要注意:
在这种情况下,可以使用errorString()方法获取更多信息
您不需要构造QFileInfo来获取文件名。QFile对象已经为此提供了一个方法。问题是,您正在递归地迭代,因此,您只打印出基本名称,而不知道文件驻留的位置。如果在不同的子目录中有同名的文件,也可以多次显示相同的文件名。
为什么不使用QDir::entryList?
From Qt Assistant:
<我>QStringList::entryList (const QStringList &nameFilters, Filters Filters = NoFilter, SortFlags sort = NoSort) const返回目录中所有文件和目录的名称列表,根据先前使用setNameFilters()和setFilter()设置的名称和属性过滤器排序,并根据setSorting()设置的标志排序。我>
可以使用nameFilters、filters和sort参数覆盖名称过滤器、文件属性过滤器和排序规范。
如果目录不可读、不存在或没有任何内容与规范匹配,则返回空列表。
参见entryInfoList(), setNameFilters(), setSorting()和setFilter()。
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量