В пространстве имён System.IO доступно несколько классов для работы с объектами файловой системы дисками, каталогами, файлами.
Класс DriveInfo инкапсулирует информацию о диске. Он имеет статический метод GetDrives() для получения массива объектов DriveInfo, соответствующих дискам операционной системы. В примере кода демонстрируется работа с элементами класса DriveInfo.
var allDrives = DriveInfo.GetDrives();
foreach (var d in allDrives)
{
Console.WriteLine("Диск: {0}", d.Name);
Console.WriteLine("Его тип: {0}", d.DriveType);
if (!d.IsReady) continue;
Console.WriteLine("Метка тома: {0}", d.VolumeLabel);
Console.WriteLine("Файловая система: {0}", d.DriveFormat);
Console.WriteLine("Корневой каталог: {0} ", d.RootDirectory);
Console.WriteLine("Общий объем, байт: {0}", d.TotalSize);
Console.WriteLine("Свободно, байт: {0}", d.TotalFreeSpace);
Console.WriteLine("Доступно пользователю, байт: {0}",
d.AvailableFreeSpace);
}
Классы Directory, File, DirectoryInfo и FileInfo предназначены для работы с каталогами и файлами. Первые два класса выполняют операции при помощи статических методов, вторые два – при помощи экземплярных методов.
Рассмотрим работу с классами DirectoryInfo и FileInfo. Данные классы являются наследниками абстрактного класса FileSystemInfo. Этот класс содержит следующие основные элементы, перечисленные в табл. 11.
Таблица 11
Элементы класса FileSystemInfo
Имя элемента
|
Описание
|
Attributes
|
Свойство позволяет получить или установить атрибуты объекта файловой системы (тип – перечисление FileAttributes)
|
CreationTime
|
Время создания объекта файловой системы
|
Exists
|
Свойство для чтения, проверка существования объекта файловой системы
|
Extension
|
Свойство для чтения, расширение файла
|
FullName
|
Свойство для чтения, полное имя объекта файловой системы
|
LastAccessTime,
LastAccessTimeUtc
|
Время последнего доступа к объекту файловой системы (локальное или всемирное координированное)
|
LastWriteTime,
LastWriteTimeUtc
|
Времени последней записи для объекта файловой системы (локальное или всемирное координированное)
|
Name
|
Свойство для чтения; имя файла или каталога
|
Delete()
|
Метод удаляет объект файловой системы
|
Refresh()
|
Метод обновляет информацию об объекте файловой системы
|
Конструктор класса DirectoryInfo принимает в качестве параметра строку с именем того каталога, с которым будет производиться работа. Для указания текущего каталога используется строка ".". При попытке работать с данными несуществующего каталога генерируется исключение. Работа с методами и свойствами класса DirectoryInfo показана в следующем фрагменте кода:
var dir = new DirectoryInfo(@"C:\Temp");
// выводим некоторые свойства каталога C:\Temp
Console.WriteLine("Полное имя: {0}", dir.FullName);
Console.WriteLine("Родительский каталог: {0}", dir.Parent);
Console.WriteLine("Корневой каталог: {0}", dir.Root);
Console.WriteLine("Дата создания: {0}", dir.CreationTime);
// создаём подкаталог
dir.CreateSubdirectory("Subdir");
Класс DirectoryInfo обладает двумя наборам методов для получения дочерних подкаталогов, файлов, или объектов FileSystemInfo. Методы вида GetЭлементы() выполняются немедленно и возвращают массив. Методы вида EnumerateЭлементы() используют отложенное выполнение и возвращают перечислитель:
// получаем файлы, удовлетворяющие маске, из всех подкаталогов
FileInfo[] f = dir.GetFiles("*.txt", SearchOption.AllDirectories);
// получаем файлы, используя отложенное выполнение
foreach (var fileInfo in dir.EnumerateFiles())
Console.WriteLine(fileInfo.Name);
Класс FileInfo описывает файл на диске и позволяет производить операции с этим файлом. Наиболее важные элементы класса представлены в табл. 12.
Таблица 12
Элементы класса FileInfo
Имя элемента
|
Описание
|
AppendText()
|
Создает объект StreamWriter для добавления текста к файлу
|
CopyTo()
|
Копирует существующий файл в новый файл
|
Create()
|
Создает файл и возвращает объект FileStream для работы
|
CreateText()
|
Создает объект StreamWriter для записи текста в новый файл
|
Decrypt()
|
Дешифрует файл, зашифрованный методом Encrypt()
|
Directory
|
Свойство для чтения, каталог файла
|
DirectoryName
|
Свойство для чтения, полный путь к файлу
|
Encrypt()
|
Шифрует файл с учётом системных данных текущего пользователя
|
IsReadOnly
|
Булево свойство указывает, является ли файл файлом только для чтения
|
Length
|
Свойство для чтения, размер файла в байтах
|
MoveTo()
|
Перемещает файл (возможно, с переименованием)
|
Open()
|
Открывает файл с указанными правами доступа
|
OpenRead()
|
Создает объект FileStream, доступный только для чтения
|
OpenText()
|
Создает объект StreamReader для чтения информации из текстового файла
|
OpenWrite()
|
Создает объект FileStream, доступный для чтения и записи
|
Как правило, код, работающий с данными файла, вначале вызывает метод Open(). Рассмотрим перегруженную версию метода Open(), которая принимает три параметра. Первый параметр определяет режим запроса на открытие файла. Для него используются значения из перечисления FileMode:
-
Append – открывает файл, если он существует, и ищет конец файла. Если файл не существует, то он создается. Этот режим может использоваться только с доступом FileAccess.Write;
-
Create – указывает на создание нового файла. Если файл существует, он будет перезаписан;
-
CreateNew – указывает на создание нового файла. Если файл существует, генерирует исключение IOException;
-
Open – операционная система должна открыть существующий файл;
-
OpenOrCreate – операционная система должна открыть существующий файл или создать новый, если файл не существует;
-
Truncate – система должна открыть существующий файл и обрезать его до нулевой длины.
Рис. 1 показывает выбор FileMode в зависимости от задачи.
Рис. 1. Выбор значения FileMode.
Второй параметр метода Open() определяет тип доступа к данным файла. Для него используются элементы перечисления FileAccess:
-
Read – файл будет открыт только для чтения;
-
ReadWrite – файл будет открыт и для чтения, и для записи;
-
Write – файл открывается только для записи, то есть добавления данных.
Третий параметр задаёт возможность совместной работы с открытым файлом и представлен значениями перечисления FileShare:
-
None – совместное использование запрещено, на любой запрос на открытие файла будет возвращено сообщение об ошибке;
-
Read – файл могут открыть и другие пользователи, но только для чтения;
-
ReadWrite – другие пользователи могут открыть файл и для чтения, и для записи;
-
Write – файл может быть открыт другими пользователями для записи.
Вот пример кода, использующего метод Open():
var file = new FileInfo(@"C:\Test.txt");
FileStream fs = file.Open(FileMode.OpenOrCreate,
FileAccess.ReadWrite, FileShare.None);
Кроме методов класса FileInfo, статический класс File обладает методами, позволяющими легко прочитать и записать информацию, содержащуюся в файле определенного типа:
-
File.AppendAllLines() – добавляет к текстовому файлу набор строк;
-
File.AppendAllText() – добавляет строку к текстовому файлу;
-
File.ReadAllBytes() – возвращает содержимое файла как массив байт;
-
File.ReadAllLines() – читает текстовый файл как массив строк;
-
File.ReadLines() – читает файл как коллекцию строк, используя отложенные вычисления;
-
File.ReadAllText() – читает содержимое текстового файла как строку;
-
File.WriteAllBytes() – записывает в файл массив байт;
-
File.WriteAllLines() – записывает в файл массив или коллекцию строк;
-
File.WriteAllText() – записывает текстовый файл как одну строку;
Статический класс Path предназначен для работы с именами файлов и путями в файловой системе. Методы этого класса позволяют выделить имя файла из полного пути, скомбинировать для получения пути имя файла и имя каталога. Также класс Path обладает методами, генерирующими имя для временного файла или каталога. Для поиска стандартных папок (например, My Documents) следует применять метод GetFolderPath() класса System.Environment:
string myDocs =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Environment.SpecialFolder это перечисление, значения которого охватывают специальные каталоги операционной системы.
Класс FileSystemWatcher позволяет производить мониторинг активности выбранного каталога. У этого класса определены события, которые генерируются, когда файлы или подкаталоги создаются, удаляются, модифицируются, или изменяются их атрибуты. Применение класса FileSystemWatcher демонстрирует следующий фрагмент кода:
var watcher = new FileSystemWatcher
{
Path = @"C:/Temp", Filter = "*.txt",
IncludeSubdirectories = true,
};
FileSystemEventHandler handler = (o, e) =>
Console.WriteLine("File {0} was {1}", e.FullPath, e.ChangeType);
watcher.Created += handler;
watcher.Changed += handler;
watcher.Deleted += handler;
watcher.Renamed += (o, e) =>
Console.WriteLine("Renamed: {0} -> {1}", e.OldFullPath, e.FullPath);
watcher.Error += (o, e) =>
Console.WriteLine("Error: {0}", e.GetException().Message);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Monitoring is on. Press to exit");
Console.ReadLine();
watcher.Dispose();
Поделитесь с Вашими друзьями: |