Содержание
В предыдущей части мы рассмотрели работу с дисками. Сегодня углубимся в работу с файловой системой в C# и рассмотрим вопросы по работе с каталогами. Для работы с каталогами в пространстве имен System.IO можно использовать сразу два класса: Directory и DirectoryInfo. Во многом эти классы схожи по функциональности и оба класса являются статическими, однако, следуя рекомендациям Microsoft, класс DirectoryInfo следует использовать в том случае, если в приложении подразумевается, что объект для работы с директориями будет использоваться многократно. В отличие от DirectoryInfo, класс Directory выполняют проверку безопасности всех методов, что, в итоге, может сказаться на производительности приложения.
Класс Directory
Класс Directory — это статический класс, предоставляющий ряд статических методов для управления каталогами. Некоторые из этих методов:
CreateDirectory(path)— создает каталог по указанному путиpathDelete(path)— удаляет каталог по указанному путиpathExists(path)— определяет, существует ли каталог по указанному путиpath. Если существует, возвращаетсяtrue, если не существует, тоfalseGetDirectories(path)— получает список каталогов в каталогеpathGetFiles(path)— получает список файлов в каталогеpathMove(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. Научились создавать, перемещать и удалять каталоги, перечислять все подкаталоги в определенном каталоге. За рамками остались вопросы, касающиеся перечисления файлов в каталоге, но об этом мы подробно поговорим в следующих статьях.