Работа с файловой системой
Работа с файлами
Класс 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()); } } }
Рассмотрим следующий пример:
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.
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.
12.2. Практикум
Программным путем:
- В папке С:\temp создайте папки К1 и К2.
- В папке К1:
- создайте файл t1.txt, в который запишите следующий текст :
Иванов Иван Иванович, 1965 года рождения, место жительства г. Саратов
- создайте файл t2.txt, в который запишите следующий текст:
Петров Сергей Федорович, 1966 года рождения, место жительства г.Энгельс
- создайте файл t1.txt, в который запишите следующий текст :
- В папке К2 создайте файл t3.txt, в который перепишите вначале текст из файла t1.txt, а затем из t2.txt
- Выведите развернутую информацию о созданных файлах.
- Файл t2.txt перенесите в папку K2.
- Файл t1.txt скопируйте в папку K2.
- Папку K2 переименуйте в ALL, а папку K1 удалите.
- Вывести полную информацию о файлах папки All.
12.3. Самостоятельная работа
Используя дополнительную литературу и Интернет, рассмотрите способы организации асинхронного ввода-вывода данных