Абстрактный класс FileSystemInfo
Значительная часть членов FileSystemInfo предназначена для работы с общими характеристиками файла или каталога (метками времени, атрибутами и т. п.). Рассмотрим некоторые свойства FileSystemInfo:
Свойство | Описание |
Attributes | Позволяет получить или установить атрибуты для данного объекта файловой системы. Для этого свойства используются значения и перечисления FileAttributes |
CreationTime | Позволяет получить или установить время создания объекта файловой системы |
Exists | Может быть использовано для того, чтобы определить, существует ли данный объект файловой системы |
Extension | Позволяет получить расширение для файла |
FullName | Возвращает имя файла или каталога с указанием пути к нему в файловой системе |
LastAccessTime | Позволяет получить или установить время последнего обращения к объекту файловой системы |
LastWriteTime | Позволяет получить или установить время последнего внесения изменений в объект файловой системы |
Name | Возвращает имя указанного файла. Это свойство доступно только для чтения. Для каталогов возвращает имя последнего каталога в иерархии, если это возможно. Если нет, возвращает полностью определенное имя |
В FileSystemInfo предусмотрено и несколько методов. Например, метод Delete() - позволяет удалить объект файловой системы с жесткого диска, a Refresh() — обновить информацию об объекте файловой системы.
Класс DirectoryInfo
Данный класс наследует члены класса FileSystemInfo и содержит дополнительный набор членов, которые предназначены для создания, перемещения, удаления, получения информации о каталогах и подкаталогах в файловой системе. Наиболее важные члены класса содержатся в следующей таблице:
Член | Описание |
Create() CreateSubDirectory() | Создают каталог (или подкаталог) по указанному пути в файловой системе |
Delete() | Удаляет пустой каталог |
GetDirectories() | Позволяет получить доступ к подкаталогам текущего каталога (в виде массива объектов DirectoryInfo) |
GetFiles() | Позволяет получить доступ к файлам текущего каталога (в виде массива объектов FileInfo) |
MoveTo() | Перемещает каталог и все его содержимое на новый адрес в файловой системе |
Parent | Возвращает родительский каталог в иерархии файловой системы |
Работа с типом 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);
}
}
}
Задание. Преобразуйте метод printDirect в рекурсивный метод таким образом, чтобы можно было просмотреть информацию о всех подкаталогах текущего каталога, независимо от уровня вложенности.
Метод CreateSubdirectory() позволяет создать в выбранном каталоге как единственный подкаталог, так и множество подкаталогов (в том числе, и вложенных друг в друга). Создадим в каталоге несколько дополнительных подкаталогов:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim");
dir.CreateSubdirectory("doc"); //создали подкаталог
dir.CreateSubdirectory(@"book\2008"); //создали вложенный подкаталог
Задание. Создайте вложенный подкаталог best\2008 для каталога d:\prim\bmp.
Метод MoveTo() позволяет переместить текущий каталог по заданному в качестве параметра адресу. При этом возможно произвести переименование каталога. Например:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim\bmp");
dir.(@"d:\prim\letter\bmp");
В данном случае каталог bmp перемещается в по адресу d:\prim\letter\bmp. Так как имя перемещаемого каталога совпадает с крайним правым именем в адресе нового местоположения каталога, то переименования не происходит. Следующий пример позволит нам переименовать текущий каталог:
DirectoryInfo dir = new DirectoryInfo(@"d:\prim\letter");
dir.MoveTo(@"d:\prim\archive");
Класс Directory
Работать с каталогами файловой системы компьютера можно и при помощи класса Directory, функциональные возможности которого во многом совпадают с возможностями DirectoryInfo. Но члены данного класса реализованы статически, поэтому для их использования нет необходимости создавать объект.
Рассмотрим работу с методами данного класса на примерах.
Замечание. Удалите с диска d измененную папку prim. И еще раз скопируйте ее исходную версию из раздела 12данного электронного учебника.
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
Замечания.
1. Удаление каталога возможно только тогда, когда он пуст.
2. На практике комбинируют использование классов Directory и DirectoryInfo.
Работа с файлами
Класс Filelnfo
Класс Filelnfo предназначен для организации доступа к физическому файлу, который содержится на жестком диске компьютера. Он позволяет получать информацию об этом файле (например, о времени его создания, размере, атрибутах и т. п.), а также производить различные операции, например, по созданию файла или его удалению. Класс FileInfo наследует члены класса FileSystemInfo и содержит дополнительный набор членов, который приведен в следующей таблице:
Член | Описание |
AppendText() | Создает объект StreamWriter для добавления текста к файлу |
CopyTo() | Копирует уже существующий файл в новый файл |
Create() | Создает новый файл и возвращает объект FileStream для взаимодействия с этим файлом |
CreateText() | Создает объект StreamWriter для записи текстовых данных в новый файл |
Delete() | Удаляет файл, которому соответствует объект FileInfo |
Directory | Возвращает каталог, в котором расположен данный файл |
DirectoryName | Возвращает полный путь к данному файлу в файловой системе |
Length | Возвращает размер файла |
MoveTo() | Перемещает файл в указанное пользователем место (этот метод позволяет одновременно переименовать данный файл) |
Name | Позволяет получить имя файла |
Ореn() | Открывает файл с указанными пользователем правами доступа на чтение, запись или совместное использование с другими пользователями |
OpenRead() | Создает объект FileStream, доступный только для чтения |
OpenText() | Создает объект StreamReader (о нем также будет рассказано ниже), который позволяет считывать информацию из существующего текстового файла |
OpenWrite() | Создает объект FileStream, доступный для чтения и записи |
Как мы видим, большинство методов FileInfo возвращает объекты (FIleStream, StreamWriter, StreamReader и т. п.), которые позволяют различным образом взаимодействовать с файлом, например, производить чтение или запись в него. Приемы работы с данными потоками нам уже известны. Поэтому рассмотрим другие возможности класса FileInfo.
using System;
using System.Text;
using System.IO; //для работы с файловым вводом-выводом
using System.Text.RegularExpressions;
namespace MyProgram
{
class Program
{
static void Main()
{
//создаем новый файл и связываем с ним строковый поток
FileInfo f = new FileInfo("text.txt");
StreamWriter fOut = new StreamWriter(f.Create());
//записываем в файл данные и закрываем строковый поток,
// при этом связь с физическим файлом для f не рвется
fOut.WriteLine("ОДИН ДВА ТРИ...");
fOut.Close();
//получаем информацию о файле
Console.WriteLine("*******"+f.Name File Inf+"**************");
Console.WriteLine("File size: {0}", f.Length);
Console.WriteLine("Creation: {0}", f.CreationTime);
Console.WriteLine("Attributes: {0}", f.Attributes.ToString());
}
}
}
Замечание. Еще раз удалите с диска d измененную папку prim, затем скопирует ее исходную версию из раздела 12данного электронного учебника.
Рассмотрим следующий пример:
static void Main()
{
FileInfo f = new FileInfo(@"d:\prim\letter\letter1.txt");
f.CopyTo(@"d:\prim\bmp\letter.txt");
Directory.CreateDirectory(@"d:\prim\archives");
f.MoveTo(@"d:\prim\archives\letter1.txt");
f = new FileInfo(@"d:\prim\letter\letter2.txt");
f.Delete();
}
Задание. Посмотрите, что произойдет, если запустить эту программу еще раз. Дайте этому объяснение.
Рассмотрим еще один пример по удалению файлов:
static void printFile( FileInfo file)
{
Console.WriteLine("***** "+file.Name+" *****");
Console.WriteLine("File size: {0}", file.Length);
Console.WriteLine("Creation: {0}", file.CreationTime);
Console.WriteLine("Attributes: {0}", file.Attributes.ToString());
}
static void Main(string[] args)
{
DirectoryInfo dir = new DirectoryInfo(@"d:\prim\bmp");
FileInfo[] files = dir.GetFiles();
if (files.Length!=0)
{
Console.WriteLine("Найдено {0} файла", files.Length);
foreach (FileInfo f in files)
{
printFile(f);
f.Delete();
}
Console.WriteLine("\nТеперь в каталоге содержится {0} файлов и можно его удалить",
dir.GetFiles().Length);
dir.Delete();
}
}
Класс File
Доступ к физическим файлам можно получать и через статические методы класса File. Большинство методов объекта Fileinfo представляют в этом смысле зеркальное отражение методов объекта File.
Замечание. В последний раз удалите с диска d измененную папку prim, затем скопирует ее исходную версию из раздела 12данного электронного учебника.
static void Main(string[] args)
{
File.Copy(@"d:\prim\letter\letter1.txt",@"d:\prim\bmp\letter1.txt");
Directory.CreateDirectory(@"d:\prim\archives");
File.Move(@"d:\prim\letter\letter1.txt",@"d:\prim\archives\letter1.txt");
File.Delete(@"d:\prim\letter\letter2.txt");
Directory.Delete(@"d:\prim\letter");
}
Имеет прямой смысл использовать статический класс File, когда требуется осуществить единственный вызов метода на объект. В этом случае вызов будет выполнен быстрее, поскольку .NET Framework не придется проходить через процедуру создания экземпляра нового объекта с последующим вызовом метода. Однако если приложение осуществляет несколько операций над файлом, то более разумным представляется создать экземпляр объекта FileInfo и использовать его методы. Это позволит сэкономить определенное время, поскольку объект будет заранее настроен на нужный файл в файловой системе, в то время как статическому классу придется каждый раз осуществлять его поиск заново.
Аналогичное правило действует и при выборе между классами Directory и DirectoryInfo.