Зарезервируйте дисковое пространство перед записью файла для повышения эффективности
Я заметил огромный успех в одном из моих проектов, когда регистрация включена в первый раз. Но когда достигнут предел файла журнала, и программа снова начинает запись в начало файла, скорость ведения журнала намного быстрее (примерно на 50% быстрее). Нормально установить размер файла журнала на сотни МБ.
Большинство менеджеров загрузки выделяют фиктивный файл с требуемым размером перед началом загрузки файла. Это делает запись более эффективной, потому что весь фрагмент выделяется сразу.
Каков наилучший способ зарезервировать место на диске с помощью определенного фиксированного размера, когда моя программа запускается в первый раз?
Ответы
Ответ 1
void ReserveSpace(LONG spaceLow, LONG spaceHigh, HANDLE hFile)
{
DWORD err = ::SetFilePointer(hFile, spaceLow, &spaceHigh, FILE_BEGIN);
if (err == INVALID_SET_FILE_POINTER) {
err = GetLastError();
// handle error
}
if (!::SetEndOfFile(hFile)) {
err = GetLastError();
// handle error
}
err = ::SetFilePointer(hFile, 0, 0, FILE_BEGIN); // reset
}
Ответ 2
wRAR верен.
Откройте новый файл, используя свою любимую библиотеку, затем найдите предпоследний байт и напишите 0. Это должно выделить все необходимое место на диске.
Ответ 3
Вот простая функция, которая будет работать для файлов любого размера:
void SetFileSize(HANDLE hFile, LARGE_INTEGER size)
{
SetFilePointer(hFile, size, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
}
Ответ 4
Вы можете использовать функцию SetFileValidData для расширения логической длины файла без необходимости записывать все эти данные в диск. Однако, поскольку он позволяет читать данные на диске, которым вы, возможно, не были привилегированы, для этого требуется привилегия SE_MANAGE_VOLUME_NAME
. Внимательно прочитайте раздел "Примечания" документации.
Также реализация SetFileValidData зависит от драйвера fs.
NTFS поддерживает его и FAT только с Win7.