将整个文件读取到QString

Jou*_*oum 25 file-io qt

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

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

据我所知,这涉及到错误的办法,我声明QTextStream,但事情是那个例子,我发现似乎DO这一点,所以,我为什么不能?

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

事实上这些是*.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!!!

}
Run Code Online (Sandbox Code Playgroud)

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

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

我得到两个警告 - 我怀疑是由- ...- 当我运行循环时.在它产生32个警告之前,我在文件夹中有30个文件.无论如何,我试图读取的文件是*.JSON,根据Windows 7中的属性对话框,它们不能设置为只读隐藏.我可以使用相同的程序在完全相同的文件夹中写入文件.

有一件事我想知道是否可能是这个原因:文件名包含.在扩展名之前,即ID.file.16.json.

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

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

更新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();

    }
Run Code Online (Sandbox Code Playgroud)

dte*_*ech 29

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

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

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

我确实得到了预期的输出 - 每个文件的大小和内容.尝试该代码来检查您输错了什么.

在这一点上,我很确定问题出在你的fileList身上 - 你不会检查是否QFile::open()成功并继续.具有讽刺意味的是,如果open()失败并且您的代码仍在继续,那么您将获得文件大小正好为0,并且结果为空字符串readAll().所以问题在于您的文件名.下次检查是否open()成功 - 不这样做是一种非常糟糕的做法.

您的文件未能打开的另一个可能的候选者是它们是否可以通过其他进程打开.重新启动系统并直接运行代码以确保文件访问权限未锁定.

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


cma*_*t85 5

您提供的所有示例都没有创建QTextStream您的方式. QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)不存在,使用QTextStream s1(&file),你已经设置了开放模式QFile.

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

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