Симон Робинсон - C# для профессионалов. Том II
FileInfo MyFile = new FileInfo(@"C:Program FilesMy ProgramReadMe.txt");
MyFile.CopyTo(@"D:CopiesReadMe.txt");
Имеет тот же результат, что и:
File.Copy(@"C:Program FilesMy ProgramReadMe.txt", @"D:CopiesReadMe.txt");
Первый фрагмент кода будет выполняться немного дольше, так как он требует создания экземпляра объекта FileInfo — MyFile, но он оставляет 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);
Это может показаться странным, но на самом деле достаточно полезно. Например, если имеется программа, которая эффективно модифицирует файл, просто считывая его, затем удаляя его и создавая новый файл с новым содержимым, то будет желательно изменить дату создания, чтобы противопоставить первоначальной дате создания старого файла.
Класс Path
Класс Path не является классом, экземпляры которого будут создаваться. Скорее он предоставляет некоторые статические методы, которые облегчают работу с путями доступа. Например, предположим, что необходимо вывести имя полного пути доступа для файла ReadMe.txt в папке C:My Documents. Путь доступа к файлу можно найти с помощью следующей операции:
Console.WriteLine(Path.Combine(@"C:My Documents", "ReadMe.txt"));
Использовать класс Path значительно проще, чем пытаться справиться с символами-разделителями вручную, потому что класс Path знает различные форматы имен путей доступа в различных операционных системах. Во время написания книги Windows являлась единственной операционной системой, поддерживаемой .NET, но если, например, .NET будет в дальнейшем перенесена на Unix, то Path сможет справиться с путями доступа Unix, где в качестве разделителя в именах путей доступа используется /, а не . Path.Combine является методом этого класса, который будет вероятно использоваться чаще всего, но Path реализует также другие методы, которые предоставляют информацию о пути доступа или требуемом для него формате.
В следующем разделе будет дан пример, который поясняет, как просмотреть каталоги и увидеть свойства файлов
Пример: файловый браузер
В этом разделе представлен пример приложения C#, называемого FileProperties. FileProperties представляет простой интерфейс пользователя, который позволяет перемещаться по файловой системе и видеть время создания время последнего доступа, время последней записи и размер файлов.
Приложение FileProperties выглядит следующим образом. Пользователь вводит имя папки или файла в основное текстовое поле в верхней части окна и нажимает кнопку Display. Если вводится путь доступа к папке, ее содержимое выводится в окне списка. Если ввести путь доступа к файлу, то данные о нем появятся в текстовых полях в нижней части формы, а содержимое папки — в окне списка. На экране показано приложение FileProperties, используемое для просмотра папки:
Пользователь может очень легко перемещаться по файловой системе, щелкая мышью на любой из папок в правом окне списка для перехода в эту папку или на кнопке Up для перемещения в родительскую папку. На приведенном выше экране в основном текстовом поле введено C:4990, чтобы получить содержимое этого раздела, который использует окно списка для дальнейшего перемещения. Пользователь может также выбрать файл, щелкая на его имени в окне списка, в этом случае его свойства выводятся в текстовых полях: