В 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:
Если нужно получить больше информации о дисках, нужно использовать тип 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());
}