Работа с файловой системой в C#. Работа с каталогами (классы Directory и DirectoryInfo)

В предыдущей части мы рассмотрели работу с дисками. Сегодня углубимся в работу с файловой системой в C# и рассмотрим вопросы по работе с каталогами. Для работы с каталогами в пространстве имен System.IO можно использовать сразу два класса: Directory и DirectoryInfo. Во многом эти классы схожи по функциональности и оба класса являются статическими, однако, следуя рекомендациям Microsoft, класс DirectoryInfo следует использовать в том случае, если в приложении подразумевается, что объект для работы с директориями будет использоваться многократно. В отличие от DirectoryInfo, класс Directory выполняют проверку безопасности всех методов, что, в итоге, может сказаться на производительности приложения.

Класс Directory

Класс Directory — это статический класс, предоставляющий ряд статических методов для управления каталогами. Некоторые из этих методов:

  • CreateDirectory(path)— создает каталог по указанному пути path
  • Delete(path)— удаляет каталог по указанному пути path
  • Exists(path)— определяет, существует ли каталог по указанному пути path. Если существует, возвращается true, если не существует, то false
  • GetDirectories(path)— получает список каталогов в каталоге path
  • GetFiles(path)— получает список файлов в каталоге path
  • Move(sourceDirName, destDirName)— перемещает каталог
  • GetParent(path)— получение родительского каталога
  • GetDirectoryRoot(path) — возвращает для заданного пути сведения о томе и корневом каталоге по отдельности или сразу
  • GetCurrentDirectory() — получает текущий рабочий каталог приложения

Как в C# получить список всех каталогов в определенном каталоге?

Получим список всех каталогов в каталоге C:\Windows:

foreach (string sub in Directory.GetDirectories(@"C:\Windows"))
    Console.WriteLine($"   {sub}");

Результат вывода будет примерно следующим:

C:\Windows\addins
C:\Windows\appcompat
C:\Windows\apppatch
C:\Windows\AppReadiness
C:\Windows\assembly
C:\Windows\bcastdvr
C:\Windows\BitLockerDiscoveryVolumeContents
C:\Windows\Boot
C:\Windows\Branding
C:\Windows\BrowserCore
C:\Windows\CbsTemp
Обратите внимание как записан путь к каталогу Windows. Мы использовали регулярный буквальный литерал (символ @).

Как в C# получить путь к каталогу из которого запущена программа?

Для получения каталога из которого было запущено приложение можно воспользоваться методом Directory.GetCurrentDirectory(). Например,

string curDir = Directory.GetCurrentDirectory();
Console.WriteLine($"Программа запущена из каталога: {curDir}");

Результат может быть примерно таким:

Программа запущена из каталога: C:\Users\username\source\repos\FileSystem\bin\Debug\net5.0

Как в C# получить сведения о родительском каталоге и томе?

Для получения сведений о родительском каталоге в C# используется метод Directory.GetParent(), а для получения корневого тома — метод Directory.GetDirectoryRoot(). Например,

string curDir = Directory.GetCurrentDirectory();
Console.WriteLine($"Программа запущена из каталога: {curDir}");
Console.WriteLine($"Родительский каталог: {Directory.GetParent(curDir)}");
Console.WriteLine($"Корневой том: {Directory.GetDirectoryRoot(curDir)}");

Вывод консоли будет следующим:

Программа запущена из каталога: C:\Users\username\source\repos\FileSystem\bin\Debug\net5.0
Родительский каталог: C:\Users\username\source\repos\FileSystem\bin\Debug
Корневой том: C:\

Как было сказано выше, классы Directory и DirectoryInfo во много схожи по работе, поэтому далее рассмотрим различные варианты работы с каталогами в C#, используя второй класс — DirectoryInfo.

Класс DirectoryInfo

Данный класс предоставляет функциональность для создания, удаления, перемещения и других операций с каталогами. Вот только некоторые из его свойств и методов:

  • Create(): создает каталог
  • CreateSubdirectory(path): создает подкаталог по указанному пути path
  • Delete(): удаляет каталог
  • Свойство Exists: определяет, существует ли каталог
  • GetDirectories(): получает список каталогов
  • GetFiles(): получает список файлов
  • MoveTo(destDirName): перемещает каталог
  • Свойство Parent: получение родительского каталога
  • Свойство Root: получение корневого каталога

Как можно видеть по описанию свойств и методов, часть того, что у класса Directory определено как метод (например, Exists) в DirectoryInfo определено как свойство, что позволяет использовать объект класса DirectoryInfo многократно, избегая возможно лишних проверок.

Как в C# создавать каталоги и подкаталоги?

Для создания каталогов и подкаталогов в C# используются методы DirectoryInfo.Create() и DirectoryInfo.CreateSubdirectory(path). Рассмотрим использование этих методов в следующем примере:

static void Main(string[] args)
{
    string root = @"C:\CSharp Output\";
    string subDir = @"FileSystem\bin";
    DirectoryInfo directory = new DirectoryInfo(root);
    if (!directory.Exists)
    {
        directory.Create();
    }
    DirectoryInfo newDir = directory.CreateSubdirectory(subDir);
    Console.WriteLine(newDir.FullName);
}

В этом примере мы вначале проверяем наличие директории, используя свойство DirectoryInfo.Exist и, если директория отсутствует, то создаем её. На втором шаге мы, используя метод DirectoryInfo.CreateSubdirectory(path), создаем подкаталог. Вывод консоли будет выглядеть следующим образом:

C:\CSharp Output\FileSystem\bin

Как в C# получить дату/время создания каталога и его атрибуты?

У класса DirectoryInfo есть все необходимые методы для получения информации о каталоге. Например:

    static void Main(string[] args)
    {
        string root = @"C:\CSharp Output\";
        string subDir = @"FileSystem\bin";
        DirectoryInfo directory = new DirectoryInfo(root);
        if (!directory.Exists)
        {
            directory.Create();
        }
        DirectoryInfo newDir = directory.CreateSubdirectory(subDir);
        Console.WriteLine(newDir.FullName);
        //получаем информацию о каталоге
        Console.WriteLine($"Время создания каталога: {newDir.CreationTime}");
        Console.WriteLine($"Время последнего доступа: {newDir.LastAccessTime}");
        Console.WriteLine($"Время последней записи в каталог: {newDir.LastWriteTime}");
        if ((newDir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
            Console.WriteLine("скрытый каталог");
        else
            Console.WriteLine("обычный каталог");
    }
}

Вывод консоли будет следующим:

C:\CSharp Output\FileSystem\bin
Время создания каталога: 18.10.2021 12:34:06
Время последнего доступа: 18.10.2021 12:34:06
Время последней записи в каталог: 18.10.2021 12:34:06
обычный каталог

Как в C# сделать скрытый каталог?

Для того, чтобы сделать каталог скрытым мы можем добавить к его атрибутам атрибут FileAttributes.Hidden используя оператор ИЛИ (|). Например допишем предыдущий пример следующим образом:
//делаем каталог скрытым
newDir.Attributes |= FileAttributes.Hidden;
//проверяем атрибут
if ((newDir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
    Console.WriteLine($"теперь каталог {newDir} скрыт");
else
    Console.WriteLine("обычный каталог");

Будет скрыта последняя папка (в примере — это bin). Вывод консоли:

теперь каталог C:\CSharp Output\FileSystem\bin скрыт

Как в C# удалить каталог?

Для удаления каталога в C# может использоваться метод DirectoryInfo.Delete(). При этом, следует обратить внимание, что простой вызов этого метода (без параметров) вызовет исключение в том случае, если вы попытаетесь удалить каталог в котором находятся какие-либо другие элементы, например, файлы. Поэтому, если вам необходимо удалить каталог со всем содержимым, то необходимо выполнить следующим код:

string root = @"C:\CSharp Output\FileSystem";
try
{
    DirectoryInfo directory = new DirectoryInfo(root);
    directory.Delete(true);
    Console.WriteLine("Каталог удален");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Про обработку исключений в C# см. здесь.

Как в C# переместить каталог?

string oldPath = @"C:\SomeFolder";
string newPath = @"C:\SomeDir";
DirectoryInfo dirInfo = new DirectoryInfo(oldPath);
if (dirInfo.Exists && Directory.Exists(newPath) == false)
{
    dirInfo.MoveTo(newPath);
}
При перемещении следует учитывать, что новый каталог, в который мы хотим перемесить все содержимое старого каталога, не должен существовать.

Итого

Сегодня мы рассмотрели основные моменты по работе с каталогами в C# с использованием классов Directory и DirectoryInfo. Научились создавать, перемещать и удалять каталоги, перечислять все подкаталоги в определенном каталоге. За рамками остались вопросы, касающиеся перечисления файлов в каталоге, но об этом мы подробно поговорим в следующих статьях.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии