Directory C#

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#.

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


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

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

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