Языки программирования

Классы для манипуляции с файлами и каталогами

В System.IO определено четыре класса для манипуляции с файлами и каталогами — File, FileInfo, Directory, DirectoryInfo. Классы Directory и File используются для создания, удаления, копирования и перемещения каталогов и файлов соответственно.
Классы DirectoryInfo и FileInfo также используется для манипуляции с каталогами и файлами, но предлагают свою функциональность в виде методов уровня экземпляра — они должны размещаться в памяти с помощью ключевого слова new.

DirectoryInfo

Для работы с каталогами удобнее всего использовать класс DirectoryInfo. Рассмотрим основные члены это класса:
  • Create(), CreateSubdirectory() — создает каталог или дерево каталогов по заданному имени;
  • Delete() — удаляет каталог вместе со всем содержим. Обратите внимание, в отличие от некоторых системных функций, удаляющих только пустой каталог, этот метод удаляет непустой каталог, что очень удобно — не нужно извлекать обход дерева каталогов.
  • GetDirectory() — возвращает в себе массив объектов DirectoryInfo, представляющий собой все подкаталоги заданного (текущего) каталога;
  • GetFiles() — извлекает массив объектов FileInfo, представляющий собой все файлы из текущего каталога;
  • CopyTo() — копирует каталог со всем содержим;
  • MoveTo() — перемещает весь каталог (с файлами и подкаталогами);
  • Parent — содержит родительский каталог;
  • Root — содержит корневой каталог.
Чтобы начать работу с DirectoryInfo, нужно создать новый объект этого типа, указав каталог, с которым вы будете работать:
DirectoryInfo d = new DirectoryInfo ("C:\Files");
Указать можете, как существующий, так и несуществующий каталог. Если вы пытаетесь привязаться к несуществующему каталогу, то будет сгенерировано исключение System.IO.DirectoryNotFoundException. Если нужно создать несуществующий каталог, то укажите перед его именем знак @, например:
DirectoryInfo d = new DirectoryInfo(@"C:\Files\Den");
d.Create();   //создаем новый каталог

Классы Directory и DriveInfo

Члены этого класса обычно возвращают строковые данные, а не типизированные объекты типов FilesInfo/DirectorInfo — в этом основная разница этими двумя классами.
Рассмотри пример (выведем список дисков вашего компьютера):
Console.WriteLine("Ваши диски:");
string[] drives = Directory.GetLogicalDrives();
foreach (string s in drives)
   Console.WriteLine("{0}", s);
Метод GetLogicalDrivers() возращает массив строк, а не массив объектов DirectoryInfo. Также метод вызывается без предварительного создания объекта оператором new. Данный метод сообщает буквы логических дисков, при этом невозможно понять, где и какой диск.

Если нужно получить больше информации о дисках, нужно использовать тип DriveInfo:
using System;
using System.IO;

namespace MyDriveInfo
{
    class Program
    {
       static void Main (string[] args)
       {
     //Изменяем кодировку консоли для вывода текста
        Console.OutputEncoding = Encoding.GetEncoding(866);
        Console.WriteLine("Ваши диски:");
        string[] drives = Directory.GetLogicalDrives();
        foreach (string s in drives)
           Console.WriteLine("{0}", s);

        DriveInfo[] drvs = DriveInfo.GetDrives();
        
        foreach (DriveInfo d in drvs)
        {
     Console.WriteLine("Диск: {0} Тип {1}", d.Name, d.DriveType);
            if (d.IsReady)
            {
     Console.WriteLine("Свободно: {0}", d.TotalFreeSpace);
     Console.WriteLine("Файловая система: {0}", d.DriveFormat);
     Console.WriteLine("Метка: {0}", d.VolumeLabel);
     Console.WriteLine();
            }
        }
        Console.ReadeLine();
            }
      }
}

FileInfo

Класс FileInfo используется для манипуляции с файлами.Рассмотрим его основные члены(методы):

Create()

Создает новый файл и возвращает объект FileStream, который используется для взаимодействия с созданным файлом.

CreateText()

Создает объект StreamWriter, который используется для создания текстового файла.

CopyTo()

Копирует существующий файл в другой файл.

AppendText()

Создает объект StreamWriter для добавления текста в файл.

Delete()

Удаляет файл, связанный с экземпляром FileInfo

Directory

Используется для получения экземпляра родительского каталога

DirectoryName

Содержит полный путь к родительскому каталогу

Length

Получает размер текущего файла или каталога.

MoveTo()

Используется для перемещения файла.

Name

Содержит имя файла.

Open()

Открывает файл с различными разрешениями чтения/записи.

OpenRead()

Создает доступный только для чтения объект FileStream.

OpenText()

Создает объект StreamReader для чтения информации из текстового файла.

OpenWrite()

Создает объект FileStream, доступный только для записи
Примеры использования класса FileInfo:
Использование метода Create():
FileInfo myFile = new FileInfo(@"C:\temp\file.vdd");
FileStream fs = myFile.Create();
// производим какие-либо операции с fs
// закрываем поток
fs.Close();
Тут создаётся поток FileStream, позволяющий производить манипуляции с содержимым файла, например, читать из него данные, записывать в него данные.

File

Тип File поддерживает несколько полезных методов, которые пригодятся при работе с текстовыми файлами. Например, метод ReadAllLines() позволяет открыть указанный файл и прочитать из него все строки — в результате будет возвращен массив строк. После того, как все данные из файла прочитаны, файл будет закрыт.
Аналогично, метод ReadAllBytes() читает все байты из файла, возвращает массив байтов и закрывает файл.
Метод ReadAllText() читает все содержимое текстового файла в одну строку и возвращает её. Как обычно, файл после чтения будет закрыт.
Существует и аналогичные методы записи WriteAllBytes(), WriteAllLines() и WriteAlltext(), которые записывают в файл, соответственно, массив байтов, массив строк и строку. После записи файл закрывается. Рассмотрим пример:
string[] myFriends = {"Jane", "Max", "John"};

// Записать все данные в файл
File.WriteAllLines(@"C:\temp\friends.txt", myFriends);

// Прочитать все обратно и вывести
foreach (string friend in File.ReadAllLines(@"C:\temp\friends.txt"))
{
  Console.WriteLine("{0}", friend);
}

Stream

В абстрактном классе System.IO.Stream определен набор членов, которые обеспечивают поддержку синхронного и асинхронного взаимодействия с хранилищем (например, файлом или областью памяти). Члены абстрактного класса:

CanRead, CarWrite, CanSeek

Определяют, поддерживает ли поток чтение, запись и поиск.

Close()

Метод закрывает поток и освобождает все ресурсы.

Flush()

Метод обновляет лежащий в основе источник данных. Напимер, позволяет перечитать источник.

Length

Возвращает длину потока в байтах.

Position

Определяет текущую позицию в потоке.

Read(), ReadByte()

Читает последовательность байт или один байт соответственно из текущего потока и перемещает позицию потока на количество прочитанных байтов.

Seek()

Устанавливает позицию в текущем потоке.

SetLength()

Устанавливает длину текущего потока.

Write(), WriteByte()

Записывает последовательность байтов или одиночный байт в текущий поток и перемещает текущую позицию на количество записанных байтов.

FileStream

Класс FileStream предоставляет реализацию абстрактного члена Stream для потоковой работы с файлами. Это элементарный поток, и он может записывать или читать только один байт или массив байтов.

Классы StreamWriter и StreamReader

Данные классы удобно использовать во всех случаях, когда нужно читать или записывать символьные данные. Оба типа работают по умолчанию с символами Unicode, но кодировку можно изменить предоставлением правильно сконфигурированной ссылки на объект System.Text.Encoding. Пример записи в файл с использованием StreamWriter:
using (StreamWriter writer = File.CreateText("friends.txt"))
{
  writer.WriteLine("Виктор");
  writer.WriteLine("Максим");
  writer.WriteLine("Евгений");
}
Пример чтения информации из текстового файла с помощью StreamReader:
using (StreamReader reader1 = File.OpenText("friends.txt"))
{
  string s = null;
  while ((s = reader1.ReadLine()) != null)
  {
    Console.WriteLine(s);
  }
}

Классы BinaryWriter и BinaryReader

Для работы с двоичными (не текстовыми) данными используются классы BinaryWriter и BinaryReader. Оба эти класса унаследованы от System.Object и позволяют читать и записывать данные в потоки в двоичном формате. Для записи у BinaryWriter используется метод Write(), а для чтения — метод Read() у BinaryReader. Метод Close (закрыть поток) есть у обоих классов.
Метод Flush() у BinaryWriter позволяет сбросить буфер двоичного потока на носитель. Пример использования:
FileInfo f = new FileInfo(@"file.dat");
using(BinaryWriter bw = new BinaryWriter(f.OpenWrite()))
{
// Данные для записи
double a = 1234.56;
int b = 123456;
string s = "123456";
// Записать данные.
bw.Write(a);
bw.Write(b);
bw.Write(s);
}
...
// читаем данные
using(BinaryReader br = new BinaryReader(f.OpenRead()) )
{
  Console.WriteLine(br.ReadDouble());
  Console.WriteLine(br.Readlnt32());
  Console.WriteLine(br.ReadString());
}
Самоучитель по C#