платформозависимое решение windows
HANDLE hfile = ::CreateFileA(fileName.toAscii().data(), GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
if (!hfile)
{//general way
ExtendsCommon(fileName, fileSize);//функция реализующая изменение размера с заполнением файла данными
return;
}
LARGE_INTEGER size;
size.QuadPart = fileSize;
SetFilePointer(hfile, size.LowPart, &size.HighPart, FILE_BEGIN);
SetEndOfFile(hfile);
CloseHandle(hfile);
с помощью QFile работает так же быстро:
QFile file;
file.setFileName(fileName);
file.open(QFile::Truncate | QFile::ReadWrite);
file.resize(fileSize);
file.close();
для примера размер переменной в моих тестах == 6.5 Gb
Виндовый код отрабатывает с точки зрения пользователя мгновенно (конкретное время не замерял). Под linux\unix\mac os (с случае реализации через QFile) наблюдается подвисание в момент вызова file.close(). При стандартной работе через стандартные C функции результат с тормозами такой же на закрытии файла close(fd).
int fd = open(file.toStdString().c_str(), O_TRUNC | O_CREAT | O_RDWR);
off_t res = ftruncate(fd, fileSize);
Q_ASSERT(res != -1);
close(fd);//тут происходит подвисание (под виндами не происходит в аналогичном участке кода)
Если кто то знает как можно справится с проблемой просьба подсказать. Заранее всем спасибо.