Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для oxy-fox
0 / 0 / 1
Регистрация: 02.12.2015
Сообщений: 17

Подсчет размера папки рекурсивно

03.09.2018, 01:43. Показов 2984. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу посчитать размер папки, нашел подходящую функцию на C#, переделал ее немного, но не считает. Считает только объем файлов в корневом каталоге (без учета подкаталогов), хотя при пошаговом выполнении видно, что по подкаталогам ходит и считает там объем файлов, но при каждом новом рекурсивном вызове функции сумма обнуляется... если делать глобальную переменную, то все работает.

Вот найденный мной код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
static double sizeOfFolder(string folder, ref double catalogSize)
        {
            try
            {
                //В переменную catalogSize будем записывать размеры всех файлов, с каждым
                //новым файлом перезаписывая данную переменную
                DirectoryInfo di = new DirectoryInfo(folder);
                DirectoryInfo[] diA = di.GetDirectories();
                FileInfo[] fi = di.GetFiles();
                //В цикле пробегаемся по всем файлам директории di и складываем их размеры
                foreach (FileInfo f in fi)
                {
                    //Записываем размер файла в байтах
                    catalogSize = catalogSize + f.Length;
                }
                //В цикле пробегаемся по всем вложенным директориям директории di 
                foreach (DirectoryInfo df in diA)
                {
                    //рекурсивно вызываем наш метод
                    sizeOfFolder(df.FullName, ref catalogSize);
                }
                //1ГБ = 1024 Байта * 1024 КБайта * 1024 МБайта
                //return Math.Round((double)(catalogSize / 1024 / 1024 / 1024), 1);
                return Math.Round((double)(catalogSize / 1024 / 1024 / 1024), 1);
            }
            //Начинаем перехватывать ошибки
            //DirectoryNotFoundException - директория не найдена
            catch (DirectoryNotFoundException ex)
            {
                Console.WriteLine("Директория не найдена. Ошибка: " + ex.Message);
                return 0;
            }
            //UnauthorizedAccessException - отсутствует доступ к файлу или папке
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine("Отсутствует доступ. Ошибка: " + ex.Message);
                return 0;
            }
            //Во всех остальных случаях
            catch (Exception ex)
            {
                Console.WriteLine("Произошла ошибка. Обратитесь к администратору. Ошибка: " + ex.Message);
                return 0;
            }
        }
А вот мой код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
double sizeOfFolder(String^ folder, double catalogSize)
    {
        try
        {
            DirectoryInfo^ di = gcnew DirectoryInfo(folder);
            array<DirectoryInfo^>^ diArray = di->GetDirectories();
            array<FileInfo^>^ fiArray = di->GetFiles();
 
            for each(FileInfo^ f in fiArray)
            {
                catalogSize += f->Length;
            }
            for each(DirectoryInfo^ df in diArray)
            {
                sizeOfFolder(df->FullName, catalogSize);
            }
            return catalogSize;
        }
        catch (...)
        {
        }
    }
подскажите пожалуйста, что у меня не так?..

пробовал через:
C#
1
IO::Directory::GetDirectories(folder, "*.*", IO::SearchOption::AllDirectories)
но в случает отсутствия доступа к какой либо папке подсчет суммы дальше не идет...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.09.2018, 01:43
Ответы с готовыми решениями:

Рекурсивно пройтись внутри папки по файлам
Доброго времени суток. Есть задача под линуксом запустить скрипт, который должен пройтись по всем папкам и под папкам внутри указаной...

Подсчет количества цифр в числе (рекурсивно)
как сделать этот код с помощью рекурсии? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { int n,total=0; ...

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

2
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
03.09.2018, 01:49
Лучший ответ Сообщение было отмечено oxy-fox как решение

Решение

В варианте на C# размер в метод передается по ссылке, а у вас по значению.
Вроде double sizeOfFolder(String^ folder, double %catalogSize) или как-то так по ссылке указывается...
1
 Аватар для oxy-fox
0 / 0 / 1
Регистрация: 02.12.2015
Сообщений: 17
04.09.2018, 06:20  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
варианте на C# размер в метод передается по ссылке, а у вас по значению.
Вроде double sizeOfFolder(String^ folder, double %catalogSize) или как-то так по ссылке указывается...
Спасибо, действительно так работает))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.09.2018, 06:20
Помогаю со студенческими работами здесь

Определение размера папки
привет! мой вариант dir /-c %folder% | find &quot;байт свободно&quot; как мне полученное значение записать в переменную? я с for-ом совсем не в...

Отображение размера папки в Кб, Мб, Гб и т.д.
Здравствуйте. Написал вот такую примитивную функцию для подсчета размера папки public string getSize(string path) { ...

Подсчет размера структуры
Доброго времени суток! Есть программа, написанная с применением структуры. Нужно посчитать размер этой структуры. Куда и как надо добавить...

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

Подсчет размера текста в пикселях
Добрый день. Пишу программу для печати чеков. Во время подсчетов размера буквы столкнулся с проблемой получения правильных значений их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru