显示并读取目录下的所有文件

Display and read all files in directory

本文关键字:文件 读取 显示      更新时间:2023-10-16

我试图打印出目录中所有文件的文件名。然而,有些文件不显示或无法打开。

如果我重新启动程序,以前无法打开的文件实际上被打开并显示。发生了什么事?

这是我的代码:

 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()。