Почему рассчитывается свободное и общее дисковое пространство в 2G?

Я написал утилиту информации о каталогах и (потому что я и люди, которых я написал для сбора и использования устаревшего оборудования), сделал его совместимым с DOS и Windows 9x, а также с 64-битной Windows XP/Vista/7/8 (потому что мы также используйте их.) Проблема, с которой я сталкиваюсь, заключается в том, что в Windows 9x она сообщает о доступном дисковом пространстве и общем дисковом пространстве как 2G (хорошо 1,9997 G) даже на больших дисках. В Windows XP и более поздних версиях (32-разрядных или 64-разрядных) он правильно сообщает размеры дисков. В DOS, конечно, это не проблема, так как максимальный размер в DOS уже равен 2G.

Я использую код (DInfo.Path - каталог, к которому осуществляется доступ, с [0] - буква диска - A, B, C и т. Д.):

_dos_getdiskfree(DInfo.Path[0] - 'A' + 1, &Free);

BlockSize = Free.sectors_per_cluster * Free.bytes_per_sector;

for (i = 0; i < BlockSize; i++) {
    DriveBytes += Free.total_clusters;
    if (DriveBytes < Free.total_clusters) ++DBOverflow;
    FreeBytes += Free.avail_clusters;
    if (FreeBytes < Free.avail_clusters) ++FBOverflow;
}

Единственное различие между кодом в заглушке DOS и частью исполняемого файла для Windows заключается в том, что вместо _dos_getdiskfree вместо _getdiskfree. Я использую переменные без знака __int32 в вышеприведенном коде (или unsigned long для кода DOS.) Я использовал 32-разрядную версию для совместимости и максимально уменьшил возможность перезаписи кода при преобразовании кода DOS в код Windows. В Windows XP+ я, возможно, мог бы упростить вещи, используя переменные __int64, но опять же, я не был уверен, будет ли Windows 9x предоставлять их или нет. Я даже не был уверен, позволят ли это 32-разрядные версии Windows XP+ или нет, и действительно не хотел исследовать это, просто немного упростил его. Даже на старых HW он работает достаточно быстро с циклом.

При использовании переменных переполнения и байтов 32-разрядных целых числа размер должен быть не более 8 эксабайт (килобайт, мегабайт, гигабайт, терабайт, петабайт, эксабайт, если вам интересно), и поскольку самые большие доступные в настоящее время диски измеряются одной цифрой терабайт, это ограничение не должно вызывать проблем на некоторое время. По крайней мере, это сомнительно при моей жизни.

1 ответ

Ответ, предоставленный Раймондом Ченом в комментарии, устранил проблему. Использование GetDiskFreeSpaceEx вместо GetDiskFreeSpace дало правильные результаты.

Другие вопросы по тегам