Зарезервируйте дисковое пространство перед записью файла для повышения эффективности

Я заметил огромный успех в одном из моих проектов, когда регистрация включена в первый раз. Но когда достигнут предел файла журнала, и программа снова начинает запись в начало файла, скорость ведения журнала намного быстрее (примерно на 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.