Файлы и папки C# (удаление каталога)
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел написать очень полезный скрипт по работе с файлами и папками в C#, а именно по удалению папки и всех вложенных в неё файлов и папок. Это так называемая папка-потрошилка в C#. Перед разработчиком нередко встаёт задача, связанная с работой с файловой системой. Для того, чтобы иметь возможность работать с файлами и папками в .NET Framework необходимо добавить пространство имен System.IO. Скрипт будет небольшой, но в нём мы повторим такие темы, как массивы, циклы в C#, конструкция try catch в C#, а также рекурсию. Отдельная статья по работе с файлами и папками в C# будет написана в ближайшем будущем.
Сразу оговорюсь, что папку можно удалить только тогда, когда она пуста. Т.е. она не содержит ни вложенных директорий, ни вложенных файлов.
Смысл заключается в том, чтобы получить массив вложенных директорий и вложенных файлов. Для вложенных директорий нужно повторить тот же самый процесс. Здесь нам как раз поможет организация рекурсии.
Напишу сразу пример кода:
using System; using System.Text; using System.IO; namespace TestApplicationForStudy { class Program { static void Main(string[] args) { string deletePath = "D:\\FolderToDelete"; //Можно написать вот так string deletePath = @"D:\FolderToDelete"; deleteFolder(deletePath); //Вызываем наш рекурсивный метод //После вызова метода deleteFolder() папка, путь которой указан в deletePath, //должна быть пуста. Остаётся просто удалить её. //Делаем это, вызвав метод Directory.Delete(). try { Directory.Delete(deletePath); Console.WriteLine("Папка {0} успешно удалена", deletePath); } catch { Console.WriteLine("При удалении папки возникли ошибки"); } Console.ReadLine(); } //Рекурсивный метод по удалению папки. Рекурсия - это метод, который вызывает сам себя. static void deleteFolder(string folder) { try { //Класс DirectoryInfo как раз позволяет работать с папками. Создаём объект этого //класса, в качестве параметра передав путь до папки. DirectoryInfo di = new DirectoryInfo(folder); //Создаём массив дочерних вложенных директорий директории di DirectoryInfo[] diA = di.GetDirectories(); //Создаём массив дочерних файлов директории di FileInfo[] fi = di.GetFiles(); //В цикле пробегаемся по всем файлам директории di и удаляем их foreach (FileInfo f in fi) { f.Delete(); } //В цикле пробегаемся по всем вложенным директориям директории di foreach (DirectoryInfo df in diA) { //Как раз пошла рекурсия deleteFolder(df.FullName); //Если в папке нет больше вложенных папок и файлов - удаляем её, if (df.GetDirectories().Length == 0 && df.GetFiles().Length == 0) df.Delete(); } } //Начинаем перехватывать ошибки //DirectoryNotFoundException - директория не найдена catch (DirectoryNotFoundException ex) { Console.WriteLine("Директория не найдена. Ошибка: " + ex.Message); } //UnauthorizedAccessException - отсутствует доступ к файлу или папке catch (UnauthorizedAccessException ex) { Console.WriteLine("Отсутствует доступ. Ошибка: " + ex.Message); } //Во всех остальных случаях catch (Exception ex) { Console.WriteLine("Произошла ошибка. Обратитесь к администратору. Ошибка: " + ex.Message); } } } }
Думаю, по комментариям в коде, вопросов по работе алгоритма не должно возникнуть.
Реализация подобных алгоритмов позволяет лучше прокачать свои навыки программирования.
Но, для особо ленивых, кто просто хочет удалить папку без реализации алгоритмов, можно воспользоваться методом Directory.Delete(deletePath, true). Обратите внимание на второй параметр true. Благодаря ему будет выполнен рекурсивный пробег по всем вложенным директориям (будут удалены и вложенные директории и вложенные файлы).
В качестве домашнего задания попробуйте реализовать такой алгоритм: на входе методу указывается путь к каталогу. Необходимо вывести размер (в МБ) этого каталога.
В данной статье вы узнали как работать сфайлами и папками в C# на примере удаления каталога.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.