Опубликован: 19.02.2009 | Доступ: свободный | Студентов: 3054 / 785 | Оценка: 4.35 / 4.11 | Длительность: 16:28:00
ISBN: 978-5-94774-401-9
Лекция 12:

Работа с файловой системой

< Лекция 11 || Лекция 12: 12 || Лекция 13 >

Работа с файлами

Класс 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.

12.2. Практикум

Программным путем:

  1. В папке С:\temp создайте папки К1 и К2.
  2. В папке К1:
    1. создайте файл t1.txt, в который запишите следующий текст :
      Иванов Иван Иванович, 1965 года рождения, место жительства г. Саратов
    2. создайте файл t2.txt, в который запишите следующий текст:
      Петров Сергей Федорович, 1966 года рождения, место жительства г.Энгельс
  3. В папке К2 создайте файл t3.txt, в который перепишите вначале текст из файла t1.txt, а затем из t2.txt
  4. Выведите развернутую информацию о созданных файлах.
  5. Файл t2.txt перенесите в папку K2.
  6. Файл t1.txt скопируйте в папку K2.
  7. Папку K2 переименуйте в ALL, а папку K1 удалите.
  8. Вывести полную информацию о файлах папки All.

12.3. Самостоятельная работа

Используя дополнительную литературу и Интернет, рассмотрите способы организации асинхронного ввода-вывода данных

< Лекция 11 || Лекция 12: 12 || Лекция 13 >