Классы Directory и DirectoryInfo
94C# и .NET --- Многопоточность и файлы --- Классы Directory и DirectoryInfo
DirectoryInfo содержит набор членов, используемых для создания, перемещения, удаления и перечисления каталогов и подкаталогов. В дополнение к функциональности, предоставленной базовым классом (FileSystemInfo), DirectoryInfo предлагает ключевые члены, перечисленные ниже:
- Create(), CreateSubdirectorу()
Создает каталог (или набор подкаталогов) по заданному путевому имени
- Delete()
Удаляет каталог и все его содержимое
- GetDirectories()
Возвращает массив объектов DirectoryInfo, представляющих все подкаталоги в текущем каталоге
- GetFiles()
Извлекает массив объектов FileInfo, представляющий множество файлов в заданном каталоге
- MoveTo()
Перемещает каталог со всем содержимым по новому пути
- Parent
Извлекает родительский каталог данного каталога
- Root
Получает корневую часть пути
Работа с типом DirectoryInfo начинается с указания определенного пути в качестве параметра конструктора. Если требуется получить доступ к текущему рабочему каталогу (т.е. каталогу выполняющегося приложения), применяйте нотацию ".". Вот некоторые примеры:
// Привязаться к текущему рабочему каталогу
DirectoryInfo dir1 = new DirectoryInfo(".");
// Привязаться к C:\Windows
DirectoryInfo dir2 = new DirectoryInfo(@"C:\Windows");
Во втором примере делается предположение, что переданный в конструктор путь (C:\Windows) физически существует на машине. При попытке взаимодействовать с несуществующим каталогом будет сгенерировано исключение System.IO.DirectoryNotFoundException. Таким образом, чтобы указать каталог, который пока еще не создан, сначала придется вызвать метод Create():
// Привязаться к несуществующему каталогу, затем создать его
DirectoryInfo dir3 = new DirectoryInfo(@"C:\MyCode\Testing");
dir3.Create();
После создания объекта DirectoryInfo можно исследовать его содержимое, используя любое свойство, унаследованное от FileSystemInfo. Например:
using System;
using System.IO;
namespace ConsoleApplication15_DirectoryInfo
{
class Program
{
static void Main()
{
ShowWindowsDirectoryInfo();
}
// Выводим информацию о каталоге
static void ShowWindowsDirectoryInfo()
{
DirectoryInfo dir = new DirectoryInfo(@"C:\Windows");
Console.WriteLine("***** Информация о каталоге *****\n");
Console.WriteLine("Полный путь: {0}\nНазвание папки: {1}\nРодительский каталог: {2}\n" +
"Время создания: {3}\nАтрибуты: {4}\nКорневой каталог: {5}",
dir.FullName,dir.Name,dir.Parent,dir.CreationTime,dir.Attributes,dir.Root);
Console.ReadLine();
}
}
}

В дополнение к получению базовых деталей о существующем каталоге можно расширить текущий пример использованием некоторых методов типа DirectoryInfo. Для начала применим метод GetFiles() для получения информации обо всех файлах *.jpg, расположенных в каталоге C:\Windows\Web\Wallpaper. Если на вашей машине нет каталога C:\Windows\Web\Wallpaper, измените код для чтения файлов из какого-то существующего каталога (например, прочитайте все файлы *.bmp из каталога C:\Windows).
Метод GetFiles() возвращает массив объектов типа FileInfo, каждый из которых представляет детальную информацию о конкретном файле. Предположим, что следующий статический метод класса Program вызывается в методе Main():
static void ImageDisplayFiles()
{
DirectoryInfo dir = new DirectoryInfo("C:\\Windows\\Web\\Wallpaper");
// Получить все файлы с расширением .jpg
FileInfo[] imageFiles = dir.GetFiles("*.jpg",SearchOption.AllDirectories);
// Сколько файлов найдено
Console.WriteLine("Найдено {0} картинок",imageFiles.Length);
// Вывести информацию о каждом файле
foreach (FileInfo f in imageFiles)
{
Console.WriteLine("\n******************\n");
Console.WriteLine("Имя файла: "+f.Name);
Console.WriteLine("Размер файла: "+f.Length);
Console.WriteLine("Время создания файла: " + f.CreationTime);
}
Console.ReadLine();
}

Обратите внимание на указание в вызове GetFiles() опции поиска; SearchOption.AllDirectories обеспечивает просмотр всех подкаталогов корня. После запуска этого приложения получается список файлов, отвечающих критерию поиска.
После опробования типа DirectoryInfo в действии можно приступать к изучению типа Directory. По большей части статические члены Directory повторяют функциональность, предоставленную членами уровня экземпляра, которые определены в DirectoryInfo. Вспомните, однако, что члены Directory обычно возвращают строковые данные вместо строго типизированных объектов Filelnfo/DirectoryInfo.
Пространство имен System.IO включает класс DriveInfo. Подобно Directory.GetLogicalDrives(), статический метод DriveInfo.GetDrives() позволяет получить имена дисковых приводов машины.
Однако, в отличие от Directory.GetLogicalDrives(), DriveInfo предоставляет множество дополнительных деталей (таких как тип привода, доступное свободное пространство и метка тома).