Книга: C# для профессионалов. Том II

Классы .NET, представляющие файлы и папки

Классы .NET, представляющие файлы и папки

Из приведенного выше списка можно видеть, что существуют два класса, используемых для представления папки, и два класса для файла. Какой из этих классов будет наиболее подходящим, зависит в большой степени от того, сколько раз необходимо получать доступ к папке или файлу:

Directory и File содержат только статические методы и никогда не создают экземпляров. Эти классы применяются с помощью предоставления пути доступа к соответствующему объекту файловой системы, когда вызывается метод-член. Если нужно выполнить только одну операцию на папке или файле, то эти классы более эффективны, так как не требуют создания экземпляра класса .NET.

DirectoryInfo и FileInfo реализуют приблизительно те же открытые методы, что и Directory и File, а также некоторые открытые свойства и конструкторы, но они имеют состояние и члены этих классов не являются статическими. На самом деле необходимо создать экземпляры этих классов, и при этом каждый экземпляр ассоциируется с определенной папкой или файлом. Это означает, что эти классы являются более эффективными, если выполняется несколько операций с помощью одного и того же объекта, так как они будут считывать аутентификационные и другие данные при создании соответствующего объекта файловой системы, а затем им не понадобиться больше считывать эту информацию, независимо от того, сколько методов вы будете вызывать на каждом объекте (экземпляре класса). Для сравнения, соответствующим классам без состояния понадобиться снова проверять данные файла или папки для каждого вызываемого метода.

В этом разделе мы будем в основном использовать классы FileInfo и DirectoryInfo, но оказывается, что многие (но не все) вызываемые методы реализуются также классами File и Directory (хотя в этих случаях эти методы требуют дополнительный параметр, имя пути доступа объекта файловой системы и пара методов имеют немного отличные имена). Например:

FileInfo MyFile = new FileInfo(@"C:Program FilesMy ProgramReadMe.txt");
MyFile.CopyTo(@"D:CopiesReadMe.txt");

Имеет тот же результат, что и:

File.Copy(@"C:Program FilesMy ProgramReadMe.txt", @"D:CopiesReadMe.txt");

Первый фрагмент кода будет выполняться немного дольше, так как он требует создания экземпляра объекта FileInfoMyFile, но он оставляет MyFile готовым для выполнения дальнейших действий на том же файле.

Для создания экземпляра класса FileInfo или DirectoryInfo в конструктор передается строка, содержащая путь доступа к соответствующей файловой системе. Мы только что проиллюстрировали процесс для файла. Для папки код выглядит аналогично:

DirectoryInfo MyFolder = new DirectoryInfo(@"C:Program Files");

Если путь доступа представляет объект, который не существует, то исключение будет порождено не во время создания, а в тот момент, когда будет вызван метод, которому потребовался объект соответствующей файловой системы. Можно определить существует ли объект и имеет ли соответствующий тип, проверяя свойство Exists, которое реализовано для обоих этих классов:

FileInfo Test = new FileInfo(@"C:Windows");
Console.WriteLine(Test.Exists.ToString());
Console.WriteLine(Test.CreationTime.ToString());

Отметим, что для того, чтобы это свойство возвращало true, соответствующий объект файловой системы должен быть соответствующего типа. Другими словами, если создается экземпляр объекта FileInfo, содержащий путь доступа папки или, если создается объект DirectoryInfo, задающий путь доступа файла, Exists будет иметь значение false. С другой стороны, большинство свойств и методов этих объектов будут возвращать значение, если вообще это возможно. Но они не обязательно порождают исключение из-за того, что был вызван неправильный тип объекта, а только в том случае, если требовалось выполнить что-то реально невозможное. Например, приведенный выше фрагмент кода сначала выведет false (так как C:Windows является папкой), но затем все равно правильно покажет время создания папки, так как в папке имеется эта информация. С другой стороны, если затем попробовать открыть папку, как если бы это был файл, с помощью метода FileInfo.Open(), то будет порождено исключение.

После того, как определено, что соответствующий объект файловой системы существует, можно (если используется класс FileInfo или DirectoryInfo) найти о нем информацию, используя ряд свойств, включающих:

Имя Назначение
CreationTime Время создания файла или папки.
DirectoryName(FileInfo), Parent(DirectoryInfo) Полный путь доступа содержащей папки.
Exists Существует ли файл или папка.
Extension Расширение файла. Возвращается пустым для папок.
FullName Полное имя пути доступа файла или папки.
LastAccessTime Время последнего доступа к файлу или папке.
LastWriteTime Время последней модификации файла или папки.
Name Имя файла или папки.
Root (Только DirectoryInfo.) Корневая часть пути доступа.
Length (Только FileInfo.) Возвращает размер файла в байтах.

Можно также выполнить действия на объекте файловой системы с помощью следующих методов:

Имя Назначение
Create() Создает папку или пустой файл с заданным именем. Для FileInfo он возвращает также объект потока, чтобы позволить записать в файл. Потоки будут рассмотрены позже.
Delete() Удаляет файл или папку. Для папок существует вариант рекурсивного метода Delete.
MoveTo() Перемещает и/или переименовывает файл или папку.
CopyTo() (Только FileInfo.) Копирует файл. Отметим, что не существует метода копирования для папок. Если копируются все деревья каталогов, то необходимо индивидуально скопировать каждый файл и создать новые папки, соответствующие старым папкам.
GetDirectories() (Только DirectoryInfo.) Возвращает массив объектов DirectoryInfo, представляющих все папки, содержащиеся в этой папке.
GetFiles() (Только DirectoryInfo.) Возвращает массив объектов FileInfo, представляющих все папки, содержащиеся в этой папке.
GetFileSystemObjects() (Только DirectoryInfo.) Возвращает объекты FileInfo и DirectoryInfo, представляющие все объекты, содержащиеся в этой папке, как массив ссылок FileSystemInfo.

Отметим, что приведенные выше таблицы показывают основные свойства и методы, и не являются исчерпывающими.

В приведенных выше таблицах не перечислены большинство свойств или методов, которые позволяют записывать или читать данные в файлах. Это в действительности делается с помощью потоковых объектов, которые будут рассмотрены позже. FileInfo реализует также ряд методов (Open(), OpenRead(), OpenText(), OpenWrite(), Create(), CreateText(), которые возвращают объекты потоков для этой цели).

Интересно то, что время создания, время последнего доступа, и время последней записи являются изменяемыми:

// Test является FileInfo или DirectoryInfo. Задать время создания
// как 1 Jan 2001, 7.30 am
Test.CreationTime = new DateTime(2001, 1, 1, 7, 30, 0);

Это может показаться странным, но на самом деле достаточно полезно. Например, если имеется программа, которая эффективно модифицирует файл, просто считывая его, затем удаляя его и создавая новый файл с новым содержимым, то будет желательно изменить дату создания, чтобы противопоставить первоначальной дате создания старого файла.

Оглавление книги


Генерация: 1.671. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз