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

В 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());
}

 
Поделиться в facebook
Facebook
Поделиться в twitter
Twitter
Поделиться в vk
VK
Поделиться в google
Google+
Поделиться в email
Email

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Группа в VK

Помощь проекту

Обнаружили опечатку?

Сообщите нам об этом, выделите текст с ошибкой и нажмите Ctrl+Enter, будем очень признательны!

Свежие статьи

Похожие статьи

Entity Framework

Entity Framework

ADO.NET Entity Framework (EF) — объектно-ориентированная технология доступа к данным, является object-relational mapping (ORM) решением для .NET Framework от Microsoft. Предоставляет возможность взаимодействия с объектами

 
Работа с базой данных в C#

Работа с базой данных в C#

В данной статье мы подробно поговорим о разработке небольшого приложения с помощью Visual Studio базы данных и языка C#. Советуем поэтапно выполнять все инструкции из

 
Создание сканера портов

Создание сканера портов

В прошлой статье “Сокеты в C#” мы познакомились с сокетами и подробно рассмотрели классы для работы с ними. В этой статье мы разработаем простое приложение

 
Сокеты в С#

Сокеты в С#

Сокет – это один конец двухстороннего канала связи между двумя программами, работающими в сети. Используя два сокета, можно передавать данные между разными процессами (локальными или

 

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: