| Латвия, Рига |
Работа с файловой системой
Работа с файлами
Класс 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. Самостоятельная работа
Используя дополнительную литературу и Интернет, рассмотрите способы организации асинхронного ввода-вывода данных