Страница 1 из 1

Размер каталога

Добавлено: Вт окт 15, 2013 20:42
Makar
Доброго времени суток!
Дали мне задание, написать программу, которая будет повторять действие комбинации клавиш CTRL+L TotalCommander'a.
На C# (WindowsForms) файловый менеджер написал, размеры каталогов и файлов получаю. Далее возникла проблема: размер файла с учетом размера кластера определить просто (размер файла делим на размер кластера, округляем в большую сторону и умножаем на размер кластера), а для каталога это не подходит (контрольная программа - TotalCommander). Подскажите пожалуйста, как определить размер каталога с учетом размера кластера?

Добавлено: Вт окт 15, 2013 20:58
Serge Yolkin
Суммировать размеры файлов с учётом размера кластера...

Добавлено: Вт окт 15, 2013 21:26
Makar
Serge Yolkin писал(а):Суммировать размеры файлов с учётом размера кластера...
не работает

Код: Выделить всё

public  long DirSize(DirectoryInfo d)
        {  long Size = 0;
            DirectoryInfo[] dis = d.GetDirectories();// тянем каталоги
            foreach (DirectoryInfo di in dis)
            { try
                {  Size += DirSize(di);//и понеслась рекурсия
                    count_dir++;
                }
                catch
                {//DirectoryInfo получает исключение при защищенных от 
                  //чтения файлах, если не ошибаюсь
                    count_dir++;
                }
            }
            FileInfo[] fis = d.GetFiles();//тянем файлы из текущей
            foreach (FileInfo fi in fis)
            {      Size += fi.Length;
                    count_file++;
            }
            return (Size);//возвращаем размер всего каталога (в байтах)
        }
если полученный размер (с тем, что выдает ТС - совпадает, так же как количество файлов и каталогов) поделить на размер кластера, округлить в большую сторону и умножить на размер кластера, то результат не совпадает с ТС. Скорее всего, на него влияет количество папок с файлами

Добавлено: Вт окт 15, 2013 21:29
MVV
Размеры голых папок тождественно равны нулю, учитываются только размеры файлов: создай пустую структуру и измерь её размер.

Нет ли в папке сжатых файлов?

Добавлено: Вт окт 15, 2013 22:14
Makar
извиняйте, сбрехал я, голова уже не сильно работает,
Serge Yolkin писал(а):Суммировать размеры файлов с учётом размера кластера...
работает, но для простых файлов (*.doc, *.txt, *.ехе). А вот каталог с файлами (*.sdf, *.sln и прочими файлами проекта VS) выдает размер больше. Архивов там нет точно, сжатых вроде тоже

Добавлено: Вт окт 15, 2013 22:14
GGS
IMHO, на размер с учётом кластеров должна влиять фрагментация файла.

Добавлено: Вт окт 15, 2013 22:35
MVV
GGS,
Нисколько. На размер с учетом кластеров и без влияют остаток в последнем кластере (в большую сторону), NTFS-сжатие файла и разреженность (в меньшую сторону).

Makar,
А список исключений у тебя в тотале используется? Тотал не считает исключенные файлы. А скрытые файлы точно все перечисляешь? Сравнивай лучше с размерами папки в её свойствах, там точно будет без исключений.

Добавлено: Ср окт 16, 2013 13:25
sa
MVV писал(а):Тотал не считает исключенные файлы.
Начиная с версии 8.50...

Добавлено: Чт окт 17, 2013 19:03
Makar
пробовал через свойства папки, с тоталом совпадает. Музыкальные файлы (они сжатые, если не ошибаюсь) и архивы как-то иначе считаются? У меня выходит размер выходит на 13 кластеров больше (количество файлов совпадает, скрытых нет, хотя программа их видит)

Добавлено: Чт окт 17, 2013 20:31
MVV
У тебя, вижу, сложности с NTFS-сжатием. NTFS-сжатие - это сжатие на уровне файловой системы, выражается в том, что блоки (по 16 кластеров, кажется) на диске сохраняются в сжатом виде, при этом в MFT указывается, сколько физических кластеров это заняло. И при подсчете размеров с учетом кластеров получается значение, меньшее (если сжатие успешное), чем при подсчете непосредственных размеров. Сжат файл или нет, определяется наличием атрибута C, и это никак не связано с содержимым файла.

Добавлено: Чт окт 24, 2013 14:39
Makar
всем спасибо за помощь!