![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Работа с объектами файловой системы
В пространстве имён System.IO доступно несколько классов для работы с объектами файловой системы – дисками, каталогами, файлами. Класс DriveInfo инкапсулирует информацию о диске. Он имеет статический метод GetDrives() для получения массива объектов DriveInfo, соответствующих дискам операционной системы. В примере кода демонстрируется работа с элементами класса DriveInfo. var allDrives = DriveInfo.GetDrives(); foreach (var d in allDrives) { Console.WriteLine(" Drive name: {0}", d.Name); Console.WriteLine(" Drive type: {0}", d.DriveType); if (! d.IsReady) continue; Console.WriteLine(" Volume Label: {0}", d.VolumeLabel); Console.WriteLine(" File system: {0}", d.DriveFormat); Console.WriteLine(" Root: {0}", d.RootDirectory); Console.WriteLine(" Total size: {0}", d.TotalSize); Console.WriteLine(" Free size: {0}", d.TotalFreeSpace); Console.WriteLine(" Available: {0}", d.AvailableFreeSpace); } Классы Directory, File, DirectoryInfo и FileInfo предназначены для работы с каталогами и файлами. Первые два класса выполняют операции при помощи статических методов, вторые два – при помощи экземплярных методов. Рассмотрим работу с классами DirectoryInfo и FileInfo. Данные классы являются наследниками абстрактного класса FileSystemInfo. Этот класс содержит следующие основные элементы, перечисленные в табл. 11. Таблица 11 Элементы класса FileSystemInfo
Конструктор класса DirectoryInfo принимает в качестве аргумента строку с именем того каталога, с которым будет производиться работа. Для указания текущего каталога используется строка ".". При попытке работать с данными несуществующего каталога генерируется исключение. Работа с методами и свойствами класса DirectoryInfo показана в следующем фрагменте кода: var dir = new DirectoryInfo(@" C: \Temp");
// выводим некоторые свойства каталога C: \Temp Console.WriteLine(" Full name: {0}", dir.FullName); Console.WriteLine(" Parent directory: {0}", dir.Parent); Console.WriteLine(" Root directory: {0}", dir.Root); Console.WriteLine(" Creation date: {0}", dir.CreationTime);
// создаём подкаталог dir.CreateSubdirectory(" Subdir"); Класс DirectoryInfo обладает двумя наборам методов для получения дочерних подкаталогов, файлов, или объектов FileSystemInfo. Методы вида GetЭлементы() выполняются немедленно и возвращают массив. Методы вида EnumerateЭлементы() используют отложенное выполнение и возвращают перечислитель: var dir = new DirectoryInfo(@" C: \Temp");
// получаем файлы по маске из всех подкаталогов FileInfo[] f = dir.GetFiles(" *.txt", SearchOption.AllDirectories);
// получаем файлы, используя отложенное выполнение foreach (var fileInfo in dir.EnumerateFiles()) Console.WriteLine(fileInfo.Name); Класс FileInfo описывает файл на диске и позволяет производить операции с этим файлом. Наиболее важные элементы класса представлены в табл. 12. Таблица 12 Элементы класса FileInfo
Как правило, код, работающий с данными файла, вначале вызывает метод Open(). Рассмотрим перегруженную версию метода Open() с тремя параметрами. Первый параметр определяет режим запроса на открытие файла. Для него используются значения из перечисления FileMode: Append – открывает файл, если он существует, и ищет конец файла. Если файл не существует, то он создаётся. Этот режим может использоваться только с доступом FileAccess.Write; Create – указывает на создание нового файла. Если файл существует, он будет перезаписан; CreateNew – указывает на создание нового файла. Если файл существует, генерирует исключение IOException; Open – операционная система должна открыть существующий файл; OpenOrCreate – операционная система должна открыть существующий файл или создать новый, если файл не существует; Truncate – система должна открыть существующий файл и обрезать его до нулевой длины. Рис. 4 показывает выбор FileMode в зависимости от задачи. Рис. 4. Выбор значения 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, указав в качестве аргумента одно из значений перечисления Environment.SpecialFolder. string tempFile = Path.GetTempFileName(); // c: \Temp\tmp144A.tmp string ext = Path.GetExtension(" info.txt"); //.txt string win = Environment.GetFolderPath(Environment.SpecialFolder.Windows); Класс FileSystemWatcher позволяет производить мониторинг активности выбранного каталога. У этого класса определены события, которые генерируются, когда файлы или подкаталоги создаются, удаляются, модифицируются, или изменяются их атрибуты. Применение класса 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 < enter> to exit"); Console.ReadLine();
// останавливаем мониторинг, уничтожаем FileSystemWatcher watcher.Dispose();
|