Размер каталога 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#
На связи был Алексей Гулынин, увидимся в следующих статьях.