我正在尝试读取文件夹中的所有文件,通过fileList
将它们存储在entryList()
中,然后,对于该文件夹中的每个文件,打开它并将其内容读入{{1} 1}}。我认为这应该很容易,但我无法弄清楚我做错了什么。我现在得到的错误是:
QString
我理解这与错误的方式有关,我正在声明no matching function for call to 'QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)'
,但问题是我发现的例子似乎 DO 这个,那么,为什么我不能?
另外,我注意到如果我添加测试以检查文件打开是否成功,我会收到一条警告,说“访问被拒绝”,即使我只是在阅读。虽然,我可以阅读该文件夹的内容,甚至可以使用这些文件填充QTextStream
。
这些是* .JSON文件的事实无关紧要,对吗?
我看过this,this和this示例,但无法弄清楚我做错了什么。任何帮助表示赞赏。
这是我的代码:
QListWidget
更新
通过cmannett85建议的修改,我不再收到错误,但由于某种原因,字符串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!!!
}
最后仍然是空的。
关于文件夹中的读/写权限,我现在已经注意到,如果我测试
s
当我运行循环时,我得到两个警告 - 我怀疑是if(!file.open(QIODevice::ReadWrite))
{
QMessageBox::information(0,"error",file.errorString());
}
和.
引起的。在它产生32个警告之前,我在文件夹中有30个文件。
无论如何,我试图读取的文件是* .JSON,根据Windows 7中的属性对话框,它们不能设置为只读或隐藏 。我可以使用相同的程序在完全相同的文件夹中写入文件。
有一件事我想知道是否可能是这个原因:文件名在扩展名之前包含..
,即.
。
更新2
它与ID.file.16.json
的文件名无关,使用不同的文件对其进行测试,结果相同。
此外,这两个警告确实与.
和.
有关。 ..
解决了这个问题。但奇怪的是,我应该应用QDir::Filters
过滤器,一切正常;但如果我使用QDir::Files
过滤器,则不会检测到任何文件,这与使用此过滤器仅忽略这两个元素的Qt Assistant解释相反。
更新3
遵循ddriver的建议,但仍然无法正常工作。当前代码,包括检索文件夹中的文件是:
QDir::NoDotAndDotDot
答案 0 :(得分:28)
正如所指出的,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项目网站,在那里发布问题,如有必要,还会发布错误报告。
答案 1 :(得分:5)
您提供的所有示例都不是按照您的方式创建QTextStream
。 QTextStream::QTextStream(QFile*, QIODevice::OpenModeFlag)
不存在,使用QTextStream s1(&file)
,您已在QFile
中设置了开放模式。
另外,我注意到如果我添加测试以检查文件是否打开 成功之后,即使我是公正的,我也会收到“拒绝访问”的警告 读。虽然,我可以读取文件夹的内容甚至 用这些文件填充QListWidget没有问题。
仅仅因为您有权访问该文件夹,并不意味着您可以阅读文件内容。如果您具有读取权限并且它们是纯文本文件,则应该能够在文本编辑器中打开它们。你能吗?
答案 2 :(得分: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!!!
}
答案 3 :(得分:1)
经过一次非常头疼的事后,我发现一个非常基本且简单的错误导致了这个 - 应用程序路径。
在我在问题部分添加的最后一段代码中,我添加了:
assetsFolder.setCurrent("C:/Users/THB7OI/Desktop/app/qt-book/chap08/items");
在foreach
循环之前,现在一切正常。
虽然这最终得到了肯定的答案,这是通过首先回复的人的贡献获得的,但这不是我原来的问题,因此我为其他两个答案加了1个,因为他们特别回答了我最初的要求。
此外,由于ddriver的答案专门针对fileList
问题并让我考虑了应用程序路径,因此我将其标记为正确答案。