Directory C#
Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье вы узнали немного о том, как работать с файлами в C#. В данной статье я бы хотел поговорить о том, как работать с директориями в C#. Для работы с папками в C# существует 2 класса: "Directory" и "DirectoryInfo" из пространства имен "System.IO". Разница между ними заключается в том, что в случае с классом "Directory", вы работаете со статическими методами, в случае "DirectoryInfo" — через методы объекта.
В этих классах есть 2 метода, которые представляют наибольший интерес — это получение списка папок "GetDirectories()" и списка файлов "GetFiles()". Метод "GetFiles()" у этих двух классов различается типом возвращаемого значения: у "Directory" возвращается массив строк с именами файлов, у "DirectoryInfo" — массив объектов "FileInfo". В случае получения списка файлов, для последующей работы с ним лучше использовать метод класса "DirectoryInfo". У объекта "FileInfo" очень просто обращаться к различным свойствам файла.
Давайте напишем пример, который будет демонстрировать различие работы этих методов. Будем выводить "название файла | дата создания":
using System; using System.Text; using System.IO; namespace TestApplicationForStudy { class Program { static void Main(string[] args) { string pathToDirectory = @"C:\"; { //Для начала покажу как работать с классом DirectoryInfo: // Создаём объект класса DirectoryInfo DirectoryInfo dI = new DirectoryInfo(pathToDirectory); // allFiles - это массив объектов FileInfo FileInfo[] allFiles = dI.GetFiles(); // Для каждого файла выводим "название - дата создания" // Что интересно, будут также показываться и скрытые файлы, и системные foreach (FileInfo fI in allFiles) { Console.WriteLine(fI.Name + " | " + fI.CreationTime); } } Console.WriteLine("----------------------------"); // Давайте теперь поколдуем с классом Directory { // Здесь allFiles - это массив строк string[] allFiles = Directory.GetFiles(pathToDirectory); // У строк уже нет свойств Name и CreationTime foreach (string str in allFiles) { // создаём объект fI для получения свойств Name и CreationTime FileInfo fI = new FileInfo(str); Console.WriteLine(fI.Name + " | " + fI.CreationTime); } } Console.ReadLine(); } } }
Первый способ более оптимальный с точки зрения потребляемой памяти, т.к. отсутствует строковый массив, т.е. он не висит в памяти.
Достаточно полезным является метод проверки существования директории (метод "Exists()"):
if (Directory.Exists(pathToDirectory)) Console.WriteLine("Директория существует");
При работе с директориями в C# их можно перемещать ("Move()"), удалять ("Delete()"), создавать новые ("CreateDirectory()"). Тут важно понимать, что в данном случае все эти операции делает файловая система. Мы просто вызываем методы, в которых инкапсулирована вся эта работа.
Помимо получения списка вложенных файлов, можно получить список непосредственно вложенных в эту папку директорий. За это отвечает метод "GetDirectories()".
Эти методы "GetFiles()" и "GetDirectories()" являются перегруженными, т.е. их можно вызывать с параметрами, например задать какую-нибудь маску файла.
Давайте напишем пример, который выводит все текстовые файлы директории. Давайте заодно разберем, как бы пришлось делать без маски. Данный пример больше относится для работы с файлами, но напишем его всё равно:
using System; using System.Text; using System.IO; namespace TestApplicationForStudy { class Program { static void Main(string[] args) { string pathToDirectory = @"C:\"; DirectoryInfo dI = new DirectoryInfo(pathToDirectory); { FileInfo[] allFiles = dI.GetFiles(); foreach (FileInfo fI in allFiles) { // Проверяем расширение, и если это текстовый // файл - выводим его if (fI.Extension == ".txt") { Console.WriteLine(fI.Name); } } } Console.WriteLine("----------------------------"); { // Прямо в методе указываем шаблон FileInfo[] allFiles = dI.GetFiles("*.txt"); foreach (FileInfo fI in allFiles) { Console.WriteLine(fI.Name); } } Console.ReadLine(); } } }
Во втором случае кода становится меньше (не за счет читабельности и восприятия кода), что в данном случае является преимуществом.
В качестве домашнего задания: вывести все каталоги директории.
В данной статье вы узнали, как работать с директориями в C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.