2

我正在尝试打印目录中所有文件的文件名。但是,有些文件不显示或无法打开。

如果我重新启动程序,以前无法打开的文件实际上已经打开并显示了。到底是怎么回事?

这是我的代码:

 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;
               }
       }
4

2 回答 2

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;
}

根据评论,至少要注意两点:

  • 在这种情况下,您可以使用errorString() 方法获取更多信息。

  • 您不需要构造 QFileInfo 来获取文件名。QFile 对象已经有一个方法。. 问题是您正在递归迭代,因此,您只打印出基本名称而不知道文件所在的位置。如果不同子目录中存在同名文件,您也可以多次显示相同的文件名。

于 2014-05-21T04:42:39.740 回答
1

为什么不使用 QDir::entryList?

来自 Qt 助手:

QStringList QDir::entryList ( const QStringList & nameFilters, Filters filters = NoFilter, SortFlags sort = NoSort ) const 返回目录中所有文件和目录的名称列表,按照之前用 setNameFilters 设置的名称和属性过滤器排序() 和 setFilter(),并根据 setSorting() 设置的标志进行排序。

可以使用 nameFilters、filters 和 sort 参数覆盖名称过滤器、文件属性过滤器和排序规范。

如果目录不可读、不存在或没有符合规范的内容,则返回一个空列表。

另请参见 entryInfoList()、setNameFilters()、setSorting() 和 setFilter()。

于 2014-05-21T06:58:01.710 回答