Типы Directory(Info) и File(Info)
Пространство System.IO предлагает четыре типа, позволяющие как обработку отдельных файлов, так и взаимодействие со структурой каталогов машины. Первые два из этих типов – Directory и File – с помощью различных статических членов позволяют выполнение операций создания, удаления, копирования и перемещения файлов. Родственные типы FileInfo и DirectoryInfo предлагают аналогичные возможности в виде методов экземпляра (который, таким образом, необходимо будет создать). На рис. 16.1 показана схема зависимости типов, связанных с обработкой каталогов и файлов. Обратите внимание на то, что типы Directory и File расширяют непосредственно System.Object, в то время как DirectoryInfo и FileInfo получаются из абстрактного типа FileSystemInfo.
Рис. 16.1. Типы, обеспечивающие работу с каталогами и файлами
Вообще говоря, FileInfо и DirectoryInfо являются лучшим выбором для рекурсивных операций (таких как, например, составление перечня всех подкаталогов с данным корнем), поскольку члены классов Directory и File обычно возвращает строковые значения, а не строго типизированные объекты.
Абстрактный базовый класс FileSystemInfo
Типы DirectoryInfo и FileInfo во многом наследуют свое поведение от абстрактного базового класса FileSystemInfo. По большей части члены класса FileSystemInfo используются для получения общих характеристик (таких как, например, время создания, различные атрибуты и т.д.) соответствующего файла иди каталога. В табл. 16.2 описаны свойства FileSystemInfo, представляющие наибольший интерес.
Таблица 16.2. Свойства FileSystemInfo
Свойство Описание Attributes Читает или устанавливает атрибуты, связанные с текущим файлом, представленным в перечне FileAttributes CreationTime Читает или устанавливает время создания для текущего файла или каталога Exists Может использоваться для выяснения того, существует ли данный файл или каталог Extension Читает расширение файла FullName Получает полный путь каталога или файла LastAccesTime Читает или устанавливает время последнего доступа к текущему файлу или каталогу LastWriteTime Читает или устанавливает время последнего сеанса записи в текущий файл или каталог Name Для файлов получает имя файла. Для каталогов получает имя последнего каталога в иерархии, если такая иерархия существует. Иначе получает имя каталога
Тип FileSystemInfo определяет также метод Delete(). Этот метод реализуется производными типами для удаления данного файла или каталога с жесткого диска. Кроме того, перед получением информации атрибута может вызываться Refresh(), чтобы гарантировать то, что информация о текущем файле (или каталоге) не будет устаревшей.
Работа с типом DirectoryInfo
Первым из рассматриваемых в нашем обсуждении типов, связанных с реализацией ввода-вывода и допускающих создание экземпляров, будет класс DirectoryInfo. Этот класс предлагает набор членов, используемых для создания, перемещения, удаления и перечисления каталогов и подкаталогов. Кроме функциональных возможностей, обеспеченных базовым классом (FileSystemInfo), класс DirectoryInfo предлагает и свои члены, описанные в табл. 16.3.
Таблица 16.3. Основные члены типа DirectoryInfo
Члены Описание Create() CreateSubdirectory() Создает каталог (или множество подкаталогов) в соответствии с заданным именем пути Delete() Удаляет каталог и все его содержимое GetDirectories() Возвращает массив строк, представляющих все подкаталоги текущего каталога 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:WindowTesting");
dir3.Create();
После создания объекта DirectoryInfo вы можете исследовать содержимое соответствующего каталога с помощью свойств, унаследованных от FileSystemInfo. Например, следующий класс создает новый объект DirectoryInfo, связанный с C:Windows (при необходимости измените этот путь в соответствии с установками системы на вашей машине) и отображающий ряд интересных статистических данных об указанном каталоге (рис. 16.2).
class Program {
static void Main(string[] args) {
Console.WriteLine("***** Забавы с Directory(Info) *****n");
DirectoryInfo dir = new DirectoryInfo(@"C:Windows");
// Информация о каталоге.
Console.WriteLine("***** Информация о каталоге *****");
Console.WriteLine("Полное имя: {0} ", dir.FullName);
Console.WriteLine("Имя: {0} ", dir.Name);
Console.WriteLine("Родитель: {0} ", dir.Parent);
Console.WriteLine("Создан: {0} ", dir.CreationTime);
Console.WriteLine("Атрибуты: {0} ", dir.Attributes);
Console.WriteLine("Корневой каталог: {0}", dir.Root);
Console.WriteLine("********************************n");
}
}
Рис. 16.2. Информация о каталоге Windows
Перечень FileAttributes
Свойство Attributes, предоставленное объектом FileSystemInfо, обеспечивает получение различной информации о текущем каталоге или файле, и вся она содержится в перечне FileAttributes. Имена полей этого перечня говорят сами за себя, но некоторые менее очевидные имена здесь сопровождаются комментариями (подробности вы найдете в документации .NET Framework 2.0 SDK).
public enum FileAttributes {
ReadOnly,
Hidden,
// Файл, являющийся частью операционной системы или используемый
// исключительно операционной системой.
System,
Directory,
Archive,
// Это имя зарезервировано для использования в будущем.
Device,
// Файл является 'нормальным' (если не имеет других
// установленных атрибутов),
Normal,
Temporary,
// Разреженные файлы обычно являются большими файлами,
// данные которых по большей части – нули.
SparseFile,
// Блок пользовательских данных, связанных с файлом или каталогом.
ReparsePoint,
Compressed,
Offline,
// Файл, который не будет индексирован службой индексации
// содержимого операционной системы.
NotContentIndexed,
Encrypted
}
Перечисление файлов с помощью DirectoryInfo
Вдобавок к получению базовой информации о существующем каталоге, вы можете добавить в пример несколько вызовов методов типа DirectoryInfo. Сначала используем метод GetFiles(), чтобы получить информацию обо всех файлах *.bmp, размещенных каталоге C:Windows. Этот метод возвращает массив типов FileInfo, каждый из которых сообщает подробности о конкретном файле (подробности о самом типе FileInfo будут представлены в этой главе немного позже).