Работа с файловой системой
12.1.Работа с файловой системой: классы Directory и Filе и классы DirectoryInfo и FileInfo
Работа с файловой системой
В пространстве имен System.IO предусмотрено четыре класса, которые предназначены для работы с файловой системой компьютера, т.е для создания, удаления переноса и т.д. файлов и каталогов.
Первые два типа - Directory и Fi1е реализуют свои возможности с помощью статических методов, поэтому данные классы можно использовать без создания соответствующих объектов (экземпляров классов).
Следующие типы - DirectoryInfo и FileInfo обладают схожими функциональными возможностями c Directory и Fi1е, но порождены от класса FileSystemInfo и поэтому реализуются путем создания соответствующих экземпляров классов.
Работа с каталогами
Абстрактный класс FileSystemInfo
Значительная часть членов FileSystemInfo предназначена для работы с общими характеристиками файла или каталога (метками времени, атрибутами и т. п.). Рассмотрим некоторые свойства FileSystemInfo:
Свойство | Описание |
---|---|
Attributes | Позволяет получить или установить атрибуты для данного объекта файловой системы. Для этого свойства используются значения и перечисления FileAttributes |
CreationTime | Позволяет получить или установить время создания объекта файловой системы |
Exists | Может быть использовано для того, чтобы определить, существует ли данный объект файловой системы |
Extension | Позволяет получить расширение для файла |
FullName | Возвращает имя файла или каталога с указанием пути к нему в файловой системе |
LastAccessTime | Позволяет получить или установить время последнего обращения к объекту файловой системы |
LastWriteTime | Позволяет получить или установить время последнего внесения изменений в объект файловой системы |
Name | Возвращает имя указанного файла. Это свойство доступно только для чтения. Для каталогов возвращает имя последнего каталога в иерархии, если это возможно. Если нет, возвращает полностью определенное имя |
В FileSystemInfo предусмотрено и несколько методов. Например, метод Delete() - позволяет удалить объект файловой системы с жесткого диска, a Refresh() - обновить информацию об объекте файловой системы.
Класс DirectoryInfo
Данный класс наследует члены класса FileSystemInfo и содержит дополнительный набор членов, которые предназначены для создания, перемещения, удаления, получения информации о каталогах и подкаталогах в файловой системе. Наиболее важные члены класса содержатся в следующей таблице:
Работа с типом DirectoryInfo начинается с того, что мы создаем экземпляр класса (объект), указывая при вызове конструктора в качестве параметра путь к нужному каталогу. Если мы хотим обратиться к текущему каталогу (то есть каталогу, в котором в настоящее время производится выполнение приложения), вместо параметра используется обозначение ".". Например:
// Создаем объект DirectoryInfo, которому будет обращаться к текущему каталогу DirectoryInfo dir1 = new DirectoryInfo("."); // Создаем объект DirectoryInfo, которому будет обращаться к каталогу d:\prim DirectoryInfo dir2 = new DirectoryInfo(@"d:\prim");
Если мы попытаемся создать объект DirectoryInfo, связав его с несуществующим каталогом, то будет сгенерировано исключение System.IO.DirectoryNotFoundException. Если же все нормально, то мы сможем получить доступ к данному каталогу. В примере, который приведен ниже, мы создаем объект DlrectoryInfo, который связан с каталогом d:\prim, и выводим информацию о данном каталоге:
using System; using System.Text; using System.IO; namespace MyProgram { class Program { static void Main(string[] args) { DirectoryInfo dir = new DirectoryInfo(@"d:\prim"); Console.WriteLine("***** "+dir.Name+" *****"); Console.WriteLine("FullName: {0}", dir.FullName); Console.WriteLine("Name: {0}", dir.Name); Console.WriteLine("Parent: {0}", dir.Parent); Console.WriteLine("Creation: {0}", dir.CreationTime); Console.WriteLine("Attributes: {0}", dir.Attributes.ToString()); Console.WriteLine("Root: {0}", dir.Root); } } }
Свойство Attributes позволяет получить информацию об атрибутах объекта файловой системы. Возможные значения данного свойства приведены в следующей таблице:
Значение | Описание |
---|---|
Archive | Этот атрибут используется приложениями при проведении резервного копирования, а в некоторых случаях - удаления старых файлов |
Compressed | Определяет, что файл является сжатым |
Directory | Определяет, что объект файловой системы является каталогом |
Encrypted | Определяет, что файл является зашифрованным |
Hidden | Определяет, что файл является скрытым (такой файл не будет выводиться при обычном просмотре каталога) |
Normal | Определяет, что файл находится в обычном состоянии и для него установлены любые другие атрибуты. Этот атрибут не может использоваться с другими атрибутами |
Offline | Файл (расположенный на сервере) кэширован в хранилище off-line на клиентском компьютере. Возможно, что данные этого файла уже устарели |
Readonly | Файл доступен только для чтения |
System | Файл является системным (то есть файл является частью операционной системы или используется исключительно операционной системой) |
Через DirectoryInfo можно не только получать доступ к информации о текущем каталоге, но получить доступ к информации о его подкаталогах:
class Program { static void printDirect( DirectoryInfo dir) { Console.WriteLine("***** "+dir.Name+" *****"); Console.WriteLine("FullName: {0}", dir.FullName); Console.WriteLine("Name: {0}", dir.Name); Console.WriteLine("Parent: {0}", dir.Parent); Console.WriteLine("Creation: {0}", dir.CreationTime); Console.WriteLine("Attributes: {0}", dir.Attributes.ToString()); Console.WriteLine("Root: {0}", dir.Root); } static void Main(string[] args) { DirectoryInfo dir = new DirectoryInfo(@"d:\prim"); printDirect(dir); DirectoryInfo[] subDirects = dir.GetDirectories(); Console.WriteLine("Найдено {0} подкаталогов", subDirects.Length); foreach (DirectoryInfo d in subDirects) { printDirect(d); } } }
Метод CreateSubdirectory() позволяет создать в выбранном каталоге как единственный подкаталог, так и множество подкаталогов (в том числе, и вложенных друг в друга). Создадим в каталоге несколько дополнительных подкаталогов:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim"); dir.CreateSubdirectory("doc"); //создали подкаталог dir.CreateSubdirectory(@"book\2008"); //создали вложенный подкаталог
Метод MoveTo() позволяет переместить текущий каталог по заданному в качестве параметра адресу. При этом возможно произвести переименование каталога. Например:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim\bmp"); dir.MoveTo(@"d:\prim\letter\bmp");
В данном случае каталог bmp перемещается в по адресу d:\prim\letter\bmp. Так как имя перемещаемого каталога совпадает с крайним правым именем в адресе нового местоположения каталога, то переименования не происходит. Следующий пример позволит нам переименовать текущий каталог:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim\letter"); dir.MoveTo(@"d:\prim\archive");
Класс Directory
Работать с каталогами файловой системы компьютера можно и при помощи класса Directory, функциональные возможности которого во многом совпадают с возможностями DirectoryInfo. Но члены данного класса реализованы статически, поэтому для их использования нет необходимости создавать объект.
Рассмотрим работу с методами данного класса на примерах.
Directory.CreateDirectory(@"d:\prim\2008");//создали подкаталог 2008 Directory.Move(@"d:\prim\bmp", @"d:\prim\2008\bmp");//перенесли каталог bmp в каталог 2008 Directory.Move(@"d:\prim\letter", @"d:\prim\archives");//переименовали каталог letter в archives
- Удаление каталога возможно только тогда, когда он пуст.
- На практике комбинируют использование классов Directory и DirectoryInfo.