Я предполагаю, что вы используете какой-то стример для записи вашего файла.Проблема в том, что стример буферизует данные, они не записываются немедленно в файл (обычно он ожидает, пока буфер достигнет некоторого размера, чтобы записать его).
QFile::pos
может и не отображать правильный размер, поскольку он не учитывает данные, которые все еще находятся в буфере, но не сбрасываются в файл.
Если вы flush()
, у вас будет стримерправильный размер и положение курсора:
#include <qdebug.h>
#include <qfile.h>
#include <qtextstream.h>
int main(int argc, char* argv[])
{
QFile f("example.txt");
qDebug() << "f.size() before opening =" << f.size(); // correct
if (!f.open(QFile::WriteOnly)) {
qDebug() << "Error: not opened!";
return 1;
}
QTextStream out(&f);
qDebug() << "f.size() before writing =" << f.size(); // 0: file was overwritten
out << "Hello world!\n";
qDebug() << "f.size() after writing =" << f.size(); // may be incorrect
qDebug() << "f.pos() after writing =" << f.pos(); // may be incorrect
out.flush();
qDebug() << "f.size() after flushing =" << f.size(); // correct
f.close();
qDebug() << "f.size() after closing =" << f.size(); // correct
return 0;
}
Следующий пример показывает еще худшую ситуацию, когда у вас может быть ненулевой размер, но он не соответствует правильному:
#include <qdebug.h>
#include <qfile.h>
#include <qtextstream.h>
int main(int argc, char* argv[])
{
QFile f("example.txt");
if (!f.open(QFile::WriteOnly)) return 1;
QTextStream out(&f);
for (int i = 0; i < 10000; ++i) { // 10000 works for me, may be you have to increase it to see the partial write
out << "Hello world!\n";
}
qDebug() << "f.size() after writing =" << f.size(); // may be incorrect
qDebug() << "f.pos() after writing =" << f.pos(); // may be incorrect
out.flush();
qDebug() << "f.size() after flushing =" << f.size(); // correct
f.close();
return 0;
}
Это связано с упомянутым выше фактом: в какой-то момент буфер был очищен, но некоторые данные еще предстоит записать.
Снова, чтобы быть уверенным, очистите поток перед проверкой размера.
ОБНОВЛЕНИЕ: код доступен на https://github.com/cbuchart/stackoverflow/blob/master/50669271-qt-qfilesize-always-returns-0/main.cpp