我有一个C ++ \ Qt程序,它扫描特定目录中的文件。我正在尝试在文本文件中写入包含在其中的文件的路径,但我设法做的就是写入最后一个文件的路径。
void ScanDir::qDirIteratorScanner(QString path)
{
QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
{
WriteToFile writeToFile(path, it.next());
qDebug() << "it.next()";
}
}
...
WriteToFile::WriteToFile(QString path, QString data)
{
path += "/Data.txt";
QFile file(path);
if (file.open(QFile::ReadWrite)) {
QTextStream stream(&file);
stream << data << endl;
}
}
如何将所有路径写入文本文件?
答案 0 :(得分:4)
您在每次调用QFile
时都在读/写模式下创建WriteToFile
:这会截断文件的内容,因此只保留上次调用写入的内容。
尝试:
void ScanDir::qDirIteratorScanner(QString path)
{
QDir dir(path);
QFile file(dir.absoluteFilePath("Data.txt"));
if (file.open(QFile::ReadWrite)) {
QTextStream stream(&file);
QDirIterator it(
dir,
QStringList() << "*.mp4",
QDir::Files,
QDirIterator::Subdirectories
);
while (it.hasNext())
{
stream << it.next() << endl;
}
}
}
此处文件只打开一次。如果您希望/需要保留函数WriteToFile
,请将stream
作为附加参数传递(通过引用)。
注意:强>
正如Simon Kraemer在评论中提出的那样,我使用QDir::absoluteFilePath
,因为它可以更容易地防止路径中的丢失或意外斜线。
保持设计的另一种方法可能是使用QFile::Append
模式:
void ScanDir::qDirIteratorScanner(QString path)
{
QDir dir(path);
// reset the file
{
QFile file(dir.absoluteFilePath("Data.txt"));
file.open(QFile::ReadWrite);
}
QDirIterator it(
dir,
QStringList() << "*.mp4",
QDir::Files,
QDirIterator::Subdirectories
);
while (it.hasNext())
{
WriteToFile writeToFile(path, it.next());
qDebug() << "it.next()";
}
}
WriteToFile::WriteToFile(QString path, QString data)
{
QDir dir(path);
QFile file(dir.absoluteFilePath("Data.txt"));
if (file.open(QFile::Append)) {
QTextStream stream(&file);
stream << data << endl;
}
}
答案 1 :(得分:2)
每次打开文件并向其写入一行时,都会覆盖文件中的内容。相反,尝试在追加模式下打开它,这应该导致你写的任何内容被添加到文件的末尾。
QTextStream流(&amp; file,QIODevice :: Append);
答案 2 :(得分:2)
您必须以“追加”模式打开文件,否则每次打开文件时都会覆盖其内容:
file.open(QFile::Append)
对您的代码进行2次评论:
为什么不打开文件一次?
void ScanDir::qDirIteratorScanner(QString path)
{
QFile file(QDir(path).absoluteFilePath("Data.txt"));
if(file.open(QFile::WriteOnly))
{
QTextStream stream(&file);
QDirIterator it(path, QStringList() << "*.mp4", QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext())
{
stream << it.next() << endl;
qDebug() << "it.next()";
}
}
}
答案 3 :(得分:1)
最有效的方法是将文件打开并写入qDirIteratorScanner()
而不是WriteToFile()
。这样您就可以打开文件,编写所有内容,然后关闭文件。
您现在拥有的是在每次迭代时继续打开(并覆盖)相同的文件。这就是为什么你只留下最后一次写作。或者,您可以使用QIODevice::Append
标志打开文件,但与第一个建议相比,这只是不必要的操作,您只需打开文件一次即可写入所有内容。