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

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

Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы узнали как удалить каталог в C#. В данной статье продолжаем работать с файловой системой. Выполним домашнее задание, которое было задано в предыдущей статье, а именно посчитаем размер каталога на C#. Размер каталога — это сумма размеров всех файлов, которые в нём находятся. По сути, нам нужно получить размер всех файлов в исходном каталоге, затем, если в данном каталоге есть ещё директории, рекурсивно вызвать для них тот же самый метод.

Нам нужно создать переменную, которая будет хранить в себе сумму размеров всех файлов. Я решил вынести её в метод Main и сделать ссылочного типа.

Привожу код реализации данного алгоритма:

using System;
using System.Text;
using System.IO;
namespace TestApplicationForStudy
{
    class Program
    {
        static void Main(string[] args)
        {
            string pathToDirectory = "D:\\Catalog";
            double catalogSize = 0;
            catalogSize = sizeOfFolder(pathToDirectory, ref catalogSize); //Вызываем наш рекурсивный метод
            if (catalogSize != 0)
            {
                Console.WriteLine("Размер каталога {0} составляет {1} ГБ", pathToDirectory, catalogSize); 
            }
            else
            {
                Console.WriteLine("Каталог {0} пуст.", pathToDirectory);
            }  
            Console.ReadLine();
        }

        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);
            }
            //Начинаем перехватывать ошибки
            //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#

На связи был Алексей Гулынин, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *