GetDiskFreeSpaceEx со сжатым диском - PullRequest
2 голосов
/ 25 мая 2009

Я хочу получить свободное место на сжатом диске, чтобы показать его конечному пользователю. Я использую C ++, MFC в Windows 2000 и более поздних версиях. Windows API предлагает функцию <a href="http://msdn.microsoft.com/en-us/library/aa364937%28VS.85%29.aspx" rel="nofollow noreferrer">GetDiskFreeSpaceEx()</a>.

Однако эта функция, похоже, возвращает «несжатый» размер данных. Это вызывает у меня некоторые проблемы.

Например: - Размер диска составляет 100 ГБ - Размер данных составляет 90 ГБ - Размер сжатых данных составляет 80 ГБ

Пользователь увидит, что диск заполнен на 90%, но в действительности он заполнен только на 80%.


EDIT

Как указал Глеб, функция возвращает полезную информацию.

Итак, вот новый вопрос: есть ли способ получить как сжатый, так и несжатый размер?

Ответы [ 2 ]

1 голос
/ 25 мая 2009

Я думаю, вам нужно сопоставить все файлы, запросить с помощью GetFileSize () и GetCompressedFileSize () и суммировать их. Используйте GetFileAttributes () , чтобы узнать, сжат ли файл или нет, если сжимаются только части всего тома, что, безусловно, может иметь место.

Хм, так что это не тривиально операция. Я полагаю, я должен реализовать какой-то механизм, чтобы избежать запросов всех размер файлов все время. Я имею в виду ... если У меня есть жесткий диск 800 ГБ, это может займет очень много времени, чтобы получить все размер файла.

Правда.

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

Возможно, вы также захотите прочитать о «Изменение журналов». Я никогда не использовал их сам, поэтому не знаю, как они работают, но, возможно, стоит проверить.

1 голос
/ 25 мая 2009

Функция правильно возвращает количество свободного места. Это можно продемонстрировать с помощью этой простой программы.

#include <stdio.h>
#include <windows.h>

void main() {
    ULARGE_INTEGER p1, p2, p3;
    GetDiskFreeSpaceEx(".", &p1, &p2, &p3);
    printf("%llu %llu %llu\n", p1, p2, p3);
}

После сжатия ранее несжатого каталога свободное пространство увеличивается.

Так о чем ты говоришь?

...