GetDiskFreeSpaceEx сообщает о неправильном количестве свободных байтов - PullRequest
3 голосов
/ 09 марта 2009
__int64 i64FreeBytes
unsigned __int64 lpFreeBytesAvailableToCaller,
                 lpTotalNumberOfBytes,
                 lpTotalNumberOfFreeBytes; // variables used to obtain 
                                           // the free space on the  drive

GetDiskFreeSpaceEx (Manager.capDir,
(PULARGE_INTEGER)&lpFreeBytesAvailableToCaller,
(PULARGE_INTEGER)&lpTotalNumberOfBytes,
(PULARGE_INTEGER)&lpTotalNumberOfFreeBytes);

i64FreeBytes = lpTotalNumberOfFreeBytes;
_tprintf(_T ("Number of bytes free on the drive:%I64u \n"),
     lpTotalNumberOfFreeBytes);

Я работаю над процедурой управления данными, которая является приложением командной строки Windows CE. Приведенный выше код показывает, как я получаю количество свободных байтов на конкретном диске, который содержит папку Manager.capdir (это переменная, содержащая полный путь к каталогу).

Мой вопрос заключается в том, что количество свободных байтов, о которых сообщалось в приведенном выше коде (оператор _tprintf), не совпадает с количеством свободных байтов накопителя (который я проверяю, щелкая правой кнопкой мыши на накопителе).

Я хотел бы знать, если причина этой разницы?

Ответы [ 3 ]

1 голос
/ 09 марта 2009

Цитирование (с редактированием) документации для GetDiskFreeSpaceEx , выделено мое:

lpFreeBytesAvailable [out, необязательно] -

Указатель на переменную, которая получает общее количество свободных байтов на диск, который доступен пользователю кто связан с призванием нить.

Этот параметр может быть НЕДЕЙСТВИТЕЛЕН.

Если используются квоты для каждого пользователя, это значение может быть меньше общего количество свободных байтов на диске.

lpTotalNumberOfBytes [out, необязательно] -

Указатель на переменную, которая получает общее количество байтов на диске которые доступны для пользователя, который связанный с вызывающим потоком.

Этот параметр может быть НЕДЕЙСТВИТЕЛЕН.

Если используются квоты для каждого пользователя, это значение может быть меньше общего количество байтов на диске.

Для определения общего количества байтов на диске или томе, используйте IOCTL_DISK_GET_LENGTH_INFO.

Другими словами, это число зависит от пользователя, и если вы хотите сопоставить значение, возвращаемое Explorer, используйте lpFreeBytesAvailable.

1 голос
/ 09 марта 2009

У меня однопользовательский компьютер без дисковой квоты в работе. Я разместил ваш код в диалоговом приложении MFC и запустил его, с единственным условием, что я использовал «C: \» в качестве параметра lpDirectoryName, чтобы я мог сравнить со свободным пространством диска, как сообщается системой. Это казалось логичным, поскольку свободное место имеет значение только для диска, а не для папки.

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

0 голосов
/ 09 марта 2009

Одна возможность приходит на ум. возможно, один из них не учитывает потерянное пространство при разбиении (Windows обычно оставляет 8 МБ в конце диска как слабый) По сути, существует разница между местом на физическом диске и логическим диском, представленным разделом. Или пространство, потерянное для самой файловой системы.

Я не могу сказать, так ли это на самом деле, но я бы посмотрел на это.

...