Содержание
В предыдущей части мы рассмотрели работу с дисками. Сегодня углубимся в работу с файловой системой в 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)
— получение родительского каталогаGet
— возвращает для заданного пути сведения о томе и корневом каталоге по отдельности или сразуDirectory Root(path) GetCurrentDirectory()
— получает текущий рабочий каталог приложения
Как в C# получить список всех каталогов в определенном каталоге?
Получим список всех каталогов в каталоге C:\Windows:
foreach (string sub in Directory.GetDirectories(@"C:\Windows")) Console.WriteLine($" {sub}");
Результат вывода будет примерно следующим:
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
Как в C# получить путь к каталогу из которого запущена программа?
Для получения каталога из которого было запущено приложение можно воспользоваться методом Directory.GetCurrentDirectory()
. Например,
string curDir = Directory.GetCurrentDirectory(); Console.WriteLine($"Программа запущена из каталога: {curDir}");
Результат может быть примерно таким:
Как в 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
Корневой том: C:\
Как было сказано выше, классы Directory
и DirectoryInfo
во много схожи по работе, поэтому далее рассмотрим различные варианты работы с каталогами в C#, используя второй класс — DirectoryInfo
.
Класс DirectoryInfo
Данный класс предоставляет функциональность для создания, удаления, перемещения и других операций с каталогами. Вот только некоторые из его свойств и методов:
Create()
: создает каталогCreateSubdirectory(path)
: создает подкаталог по указанному пути pathDelete()
: удаляет каталог- Свойство
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# получить дату/время создания каталога и его атрибуты?
У класса 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("обычный каталог"); } }
Вывод консоли будет следующим:
Время создания каталога: 18.10.2021 12:34:06
Время последнего доступа: 18.10.2021 12:34:06
Время последней записи в каталог: 18.10.2021 12:34:06
обычный каталог
Как в C# сделать скрытый каталог?
|
). Например допишем предыдущий пример следующим образом://делаем каталог скрытым newDir.Attributes |= FileAttributes.Hidden; //проверяем атрибут if ((newDir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) Console.WriteLine($"теперь каталог {newDir} скрыт"); else Console.WriteLine("обычный каталог");
Будет скрыта последняя папка (в примере — это 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
. Научились создавать, перемещать и удалять каталоги, перечислять все подкаталоги в определенном каталоге. За рамками остались вопросы, касающиеся перечисления файлов в каталоге, но об этом мы подробно поговорим в следующих статьях.