2014-02-02 7 views
3

Я новичок в работе с файловой системой Windows, и я застрял на этой проблеме в течение нескольких дней. Я кодирую C#, и я хочу получить точный «размер на диске» каталога, например, отображаемый в диалоговом окне «Свойства» каталогов в Windows 7.Как получить точный размер каталога на диске

Теперь я могу получить грубую фигуру, перемещаясь через каждый файл и каждый подкаталог в каталоге, используя API GetCompressedFileSize в kernel32.dll для сжатых файлов и свойство FileInfo.Length, округленное до кратного размера кластера для обычных файлов.

Я обнаружил, что некоторые файлы разделяют кластеры (?) (Размер на диске не кратен размеру кластера), в то время как другие занимают кластеры отдельно, тогда я не могу получить точный размер на диске, будь то округлять размер до кратное размеру кластера или нет.

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

Я предполагаю, что для получения точного размера файла или каталога на диске должен быть API или что-то еще. Так что это? Или есть более простой/быстрый способ сделать это? Спасибо за помощь!

+0

** не реальный ответ ** , но это может быть ... http://stackoverflow.com/questions/3750590/get-size-of-file-on-disk?rq=1 – RadioSpace

+1

" Размер на диске "не является четко определенной концепцией, особенно в NTFS, где файл может содержать ненулевые данные, но по-прежнему занимать нулевые кластеры. Проводник использует очень наивное определение. –

+0

Проводник даже не пытается выполнить то, что вы просите –

ответ

8

Это аккуратнее способ: -

private static long GetDirectorySize(string path) 
{ 
    DirectoryInfo dir = new DirectoryInfo(path); 
    return dir.EnumerateFiles("*.*", SearchOption.AllDirectories).Sum(file=> file.Length); 
} 

В основном, EnumerateFiles возвращает список FileInfo, и мы используем его свойство Length суммировать общий размер файлов каталога.

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

Чтобы получить размер на диске с помощью C#, вы должны копать глубже, как с помощью GetDiskFreeSpace

Кроме того, проверьте следующее msdn thread

Надеется, что это помогает!

+0

Это более аккуратно, но, похоже, это не решает мою проблему. Мне нужен «размер на диске». – user2594672

+0

Я отредактировал свой ответ. –

+0

Я уже просмотрел два веб-страницы, прежде чем я разместил этот вопрос. Сжатые файлы иногда могут делиться кластерами, поэтому формула не подходит, поэтому я вряд ли могу получить размер на диске каталогов. Кроме того, я не нашел способ рассказать символические ссылки из обычных файлов/папок. Я уже использую 'GetDiskFreeSpace', чтобы найти размер кластера. Все выше, что я думал и пытался. – user2594672

Смежные вопросы