четверг, 4 ноября 2010 г.

Как получить размер папки в C#

Вводная: Необходимо получить размер папки. Стандартный пример с msdn хорош всем кроме одного, если запускается под пользователем или нет прав доступа, то функция вылетает

Немного переписанная функция, работает замечательно, но размер папок к которым нет доступа на чтение не учитывает.


        #region "Размер папки"
        public static long DirSize(DirectoryInfo d)
        {
            long Size = 0;
            // Add file sizes.
            FileInfo[] fis = d.GetFiles();
            foreach (FileInfo fi in fis)
            {
                try
                {
                    Size += fi.Length;
                }
                //Данное исключение делается для пропуска папок к которым нет доступа
                catch (UnauthorizedAccessException)
                {
                    ;
                }
            }
            // Add subdirectory sizes.
            DirectoryInfo[] dis = d.GetDirectories();
            foreach (DirectoryInfo di in dis)
            {
                try
                {
                    Size += DirSize(di);
                }
                //Данное исключение делается для пропуска папок к которым нет доступа
                catch (UnauthorizedAccessException)
                {
                    ;
                }
            }
            return (Size);
        }
        #endregion


* This source code was highlighted with Source Code Highlighter.




UPDATE: Абсолютно точный размер невозможно получить даже средствами Windows. Не даёт она доступа к таблице разделов. В FAT (и FAT32) можно было напрямую прочитать таблицу и сделать подсчёт по ней