Для работы с файлами и папками в пространстве имен System.IO существуют следующие классы:
Directory - содержит ряд статических методов для выполнения различных операций с папками (создание, удаление, проверка существования, получение текущей папки и т. п.).
DirectoryInfo - аналогичен классу Directory, только его методы не статические - для использования этого класса надо создать его экземпляр (параметром для конструктора служит имя папки).
File - содержит ряд статических методов для выполнения различных операций с файлами (создание, удаление, копирование и т. п.).
FileInfo - аналогичен классу File, только его методы не статические - для использования этого класса надо создать его экземпляр (параметром для конструктора служит имя файла).
Классы Directory и File яляются непосредственными потомками класса Object, а классы DirectoryInfo и FileInfo - потомками абстрактного класса FileSystemInfo.
Класс Directory предназначен для работы с папками. Этот класс содержит статические методы для работы с папками (в отличие от класса DirectoryInfo, который содержит аналогичные методы, применяемые для экзампляра класса).
Вот основные методы класса Directory (все они статические):
CreateDirectory - создает папку с указанным именем.
Exists - проверяет существование папки с указанным именем.
Delete - удаляет папку с указанным именем.
Move - перемещает или переименовывает папку с указанным именем.
А вот пример их употребления:
using System;
//Подключаем необходимое пространство имен.
using System.IO;
namespace constest{
...
class Class1 {
...
static void Main(string[] args) {
Directory.CreateDirectory("C:\\temp");
if(Directory.Exists("C:\\temp1")) {
Console.WriteLine("Папка \"temp1\" существует");
}
else {
Console.WriteLine("Папка \"temp1\" не существует");
}
if(Directory.Exists("C:\\temp")) {
Console.WriteLine("Папка \"temp\" существует");
}
else {
Console.WriteLine("Папка \"temp\" не существует");
}
//Перемещение папки.
Directory.Move( "C:\\temp", "C:\\temp2");
//Удаление папки.
Directory.Delete( "C:\\temp2");
}}}
Обратите внимание, что метод Move можно использовать не только для перемещения, но и для переименования папки (что мы, фактически, в нашем примере и делаем). Для этого папка, задаваемая первым параметром (т. е. та, которую перемещаем) должна находиться на том же уровне, что и папка, задаваемая вторым параметром (т. е. куда перемещаем).
Класс Filelnfo представляет файл, содержащийся на жестком диске компьютера. Он позволяет получать информацию об этом файле (например, о времени его создания, размере, атрибутах и т. п.), а также производить различные операции, например по созданию файла или его удалению. Этот класс наследует множество членов от FileSystemlnfo и, кроме того, обладает еще и набором собственных уникальных членов.
Таблица .Наиболее важные члены класса Filelnfo
Член
Описание
AppendText()
Создает объект StreamWriter (о нем будет рассказано дальше) для добавлениятекста к файлу
CopyTo()
Копирует уже существующий файл в новый файл
Create()
Создает новый файл и возвращает объект FileStream (о нем также будетрассказано ниже) для взаимодействия с этим файлом
CreateText()
Создает объект StreamWriter для записи текстовых данных в новый файл
Delete()
Удаляем файл, которому соответствует объект Filelnfo
Directory
Возвращает каталог, в котором расположен данный файл
DirectoryName()
Возвращает полный путь к данному файлу в файловой системе
Length
Возвращает размер файла
MoveTo()
Перемещает файл в указанное пользователем место (этот метод позволяетодновременно переименовать данный файл)
Name
Позволяет получить имя файла
Ореn()
Открывает файл с указанными пользователем правами доступа на чтение, запись или совместное использование с другими пользователями
OpenRead()
Создает объект FileStream, доступный только для чтения
OpenText()
Создает объект StreamReader (о нем также будет рассказано ниже), который позволяет считывать информацию из существующего текстового файла
OpenWrite()
Создает объект FileStream, доступный для чтения и записи
public class FileManipulator {
public static int Main(string[] args){
// Создаем новый файл в корневой каталоге диска С:
Filelnfo f = new FileInfo(@"C:\Test.txt");
FileStream fs = f.Create();
// Выводим основную информацию о созданной нами файле
Обратите внимание, что метод Create() возвращает объект FileStream, который позволяет взаимодействовать с файлом. После запуска нашего приложения мы сможем увидеть созданный файл (до его удаления) в корневом каталоге диска С.
Использование метода Filelnfo.Open()
Метод Filelnfo.Open() может быть использован как для открытия уже существующего файла, так и для создания нового с большим количеством возможностей, чем метод Filelnfo.Create(). Вот пример использования этого метода:
// Открываем (или создаем) файл для чтения и записи, но без возможности совместного использования и сохраняем указатель на этот файл в объекте FileStream
Filelnfo f2 = new FileInfo((@"C:\HelloThere.ini");
FileStream s = f2.Open(FileMode.OpenOrCreate. FileAccess.ReadWrite, FileShare.None);
fs.Close();
f2.Delete());
Эта версия перегруженного метода Open() принимает три параметра. Первый из них определяет вид запроса на открытие файла (создание нового файла, открытие существующего файла, добавление к существующему файлу и т. п.). Для него используются значения из перечисления FileMode.
Таблица.Значения перечисления FileMode
Значение
Описание
Append
Открывает файл, если он существует, и ищет конец этого файла. Если указанный файл не существует, создается новый файл. Обратите внимание, что режим FileMode-Access может быть использован только совместно с доступом типа FileAccess.Write
Create
Указывает, что операционная система должна создать новый файл. Будьте осторожны — если в каталоге уже существует файл с таким же именем, он будет перезаписан!
CreateNew
Также определяет создание нового файла, но если файл с тем же именем уже существует в каталоге, будет сгенерировано исключение IOException
Open
Определяет, что операционная система должна открыть существующий файл
OpenOrCreate
Определяет, что операционная система должна открыть файл, если он существует. Если же нет, то файл с таким названием должен быть создан
Truncate
Определяет, что операционная система должна открыть существующий файл. После открытия он должен быть обрезан до нулевой длины
Второй параметр определяет тип доступа к файлу как к потоку байтов. Для него используются параметры из перечисления FileAccess
Таблица .Значения перечисления FileAccess
Значение
Описание
Read
Файл будет открыт только для чтения
ReadWrite
Файл будет открыт и для чтения, и для записи
Write
Файл будет открыт только для записи
Третий параметр определяет возможности совместного доступа к открытому файлу. Набор значений для него — в перечислении FileShare.
Таблица .Значения перечисления FileShare
Значение
Описание
None
Совместное использование открытого файла запрещено. На любой запрос на открытие данного файла будет возвращено сообщение об ошибке
Read
Позволяет открывать файл одновременно и другим пользователям, но толькона чтение. Если этот флаг не установлен, на любые запросы на открытие данного файла на чтение будет возвращаться сообщение об ошибке
ReadWrite
Позволяет открывать файл одновременно и другим пользователям на чтение и запись
Write
Позволяет открывать файл одновременно и другим пользователям на запись
Методы FileInfo.OpenRead() и Filelnfo.OpenWrite()
Помимо метода Ореn(), в Filelnfo предусмотрены также методы OpenRead() и OpenWrite().
Как вы, наверное, уже догадались, эти методы возвращают объекты FileStream, открытые только для чтения или только для записи. Например:
// Получаем объект FileStream с доступен только для чтения
Filelnfo f3 = new FileInfo(@"C:\boot.in1"):
FileStream readOnlyStream – f3.OpenRead();
readOnlyStream.Close();
// А теперь - объект FileStream с доступом только для записи
Filelnfo f4 = new FileInfo(@"C:\config.sys"):
FileStream writeOnlyStream = f4.OpenWrite():
wrlteOnlyStream.Close();
Методы Filelnfo.OpenText(), Filelnfo.CreateText()
Еще один метод класса Filelnfo, позволяющий открывать файл для чтения, — метод ОреnТехt(). Его главное отличие от Open(), OpenRead(), OpenWrite() заключается в том, что этот метод возвращает вместо FileStream объект StreamReader.
// Получаем объект StreamReader
Filelnfo f5 = new FileInfo(@"C:\bootlog.txt"):
StreamReader sreader = f5.OpenText();
sreader.Close();
Последние два метода, которые представляют для нас интерес, — метод CreateText () и AppendText(). Оба эти метода возвращают объект StreamWriter:
// Получаем объекты StreamWriter
Filelnfo f6 = new FileInfo(@"D:\AnotnerTest.txt");
f6.Open(FileMode.Create, FileAccess.ReadWrite);
StreamWriter writer = f6.CreateText();
writer.Close();
Filelnfo f7 = new FileInfo(@"D:\FinalTest.txt");
f7.Open(FileMode.Create, Fi1eAccess.ReadWrite);
StreamWriter swriterAppend = f7.AppendText();
swriterAppend.Close();
К этому моменту мы с вами уже научились получать при помощи Filelnfo объекты FileStream, StreamReader и StreamWriten.