显示和读取目录中的所有文件

时间:2014-05-21 00:55:42

标签: c++ qt qtcore qfile qdir

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

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

这是我的代码:

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

2 个答案:

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