30

我正在尝试读取文件夹中的所有文件,将它们存储在fileListvia中entryList(),然后对于该文件夹中的每个文件,打开它并将其内容读入QString. 我认为这应该很容易,但我无法弄清楚我做错了什么。我现在得到的错误说:

no matching function for call to 'QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)'

我知道这与我声明的错误QTextStream方式有关,但问题是我发现的示例似乎可以做到一点,那么,为什么我不能呢?

另外,我注意到,如果我添加测试以检查文件打开是否成功,我会收到一条警告说“访问被拒绝”,即使我只是在阅读。虽然,我可以读取文件夹的内容,甚至可以QListWidget毫无问题地用这些文件填充 a。

这些是 *.JSON 文件的事实应该无关紧要,对吧?

我已经看过这个这个这个例子,但无法弄清楚我做错了什么。任何帮助表示赞赏。

这是我的代码:

foreach(QString fileName, fileList){

    QFile file(fileName);
    file.open(QIODevice::ReadOnly);
    QString s;

    QTextStream s1(&file, QIODevice::ReadOnly);
    s.append(s1.readAll());

    qDebug() << "string content:" << s; // empty!!!

}

更新 通过 cmannett85 建议的修改,我不再收到错误,但由于某种原因,字符串s最终仍然为空。关于文件夹中的读/写权限,我现在注意到,如果我测试

if(!file.open(QIODevice::ReadWrite))
        {
            QMessageBox::information(0,"error",file.errorString());
        }

当我运行循环时,我收到两个警告 - 我怀疑是由.and引起的。..在它产生 32 个警告之前,我在文件夹中有 30 个文件。无论如何,我要读取的文件是 *.JSON 并且根据 Windows 7 中的属性对话框,它们没有设置为read-onlyhidden。我可以使用相同的程序将文件写入完全相同的文件夹中。

我想知道一件事是否可能是造成这种情况的原因:文件名包含.在扩展名之前,即ID.file.16.json.

更新 2 它与使用不同文件测试过的文件名无关,.结果是相同的。

此外,这两个警告确实与.and相关..QDir::Filters解决了这个问题。不过,奇怪的是,如果我应用QDir::Files过滤器,一切都很好;但是如果我使用QDir::NoDotAndDotDot过滤器,则不会检测到任何文件,这与 Qt 助手的解释相反,即使用此过滤器仅忽略这两个元素。

更新 3

遵循ddriver的建议,但仍然无法正常工作。当前代码,包括检索文件夹中的文件是:

QDir assetsFolder = QDir("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");

QStringList files = assetsFolder.entryList(QDir::Files);

    // for each file in the folder,
    foreach (QString file, files) {
        QFile f(file);
        if (!f.open(QFile::ReadOnly | QFile::Text)) break;
        QTextStream in(&f);
        qDebug() << f.size() << in.readAll();

        f.close();

    }
4

4 回答 4

40

正如所指出的,没有这样的构造函数QTextStream

我快速输入了这几行来验证它确实工作正常:

foreach (QString file, files) {
    QFile f(file);
    if (!f.open(QFile::ReadOnly | QFile::Text)) break;
    QTextStream in(&f);
    qDebug() << f.size() << in.readAll();
}

我确实得到了预期的输出——每个文件的大小和内容。尝试该代码以检查您是否输入错误任何内容。

在这一点上,我很确定问题出在你fileList身上——你不检查是否QFile::open()成功并继续。具有讽刺意味的是,如果open()失败并且您的代码继续运行,则文件大小将恰好为 0,而readAll(). 所以问题出在你的文件名上。下次检查是否open()成功 - 不这样做是一种非常糟糕的做法。

您的文件无法打开的另一个可能的候选是它们是否已打开以供其他进程写入。重新启动系统并直接运行代码以确保文件访问未被锁定。

如果这也没有帮助,请前往 Qt 项目网站,在那里发布问题,并在必要时发布错误报告。

于 2013-06-17T16:04:47.557 回答
5

您提供的所有示例都没有创造QTextStream出您现在的样子。 QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)不存在,使用QTextStream s1(&file),你已经在QFile.

另外,我注意到,如果我添加测试以检查文件打开是否成功,我会收到一条警告说“访问被拒绝”,即使我只是在阅读。虽然,我可以读取文件夹的内容,甚至可以毫无问题地用这些文件填充 QListWidget。

仅仅因为您可以访问该文件夹,并不意味着您可以读取文件内容。如果您具有读取权限并且它们是纯文本文件,您应该能够在文本编辑器中打开它们。你可以吗?

于 2013-06-17T14:08:52.390 回答
2

从您的示例中将无法正常工作,因为您获得的是文件列表(文件名)而不是带有路径的文件;

QStringList filters;
filters << "*.json";

QDir assetsFolder = QDir("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");
assetsFolder.setNameFilters(filters);
assetsFolder.setFilter(QDir::Files);

QFileInfoList files = assetsFolder.entryInfoList();
foreach (QFileInfo fi, files) {

    QFile file(fi.absoluteFilePath());

    if (!f.open(QFile::ReadOnly | QFile::Text)) continue;

    QTextStream in(&f);

    qDebug() << "string content:" << in.readAll(); // will not be empty!!!
}
于 2014-02-24T15:43:53.537 回答
1

好吧,在非常头疼之后,我发现一个非常基本且简单的错误导致了这个 -应用程序路径

在我在问题部分添加的最后一段代码中,我添加了:

assetsFolder.setCurrent("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");

foreach循环之前,现在一切正常。

虽然这最终成为了明确的答案,由首先回答的人的贡献获得,但这不是我最初的问题,因此我对我得到的另外两个答案 +1,因为他们专门回复了我最初问的。

此外,由于 ddriver 的答案专门针对该fileList问题并让我思考应用程序路径,因此我将其标记为正确答案。

于 2013-06-18T07:43:15.683 回答