Классы File и FileInfo

92

Класс FileInfo позволяет получать подробности относительно существующих файлов на жестком диске (т.е. время создания, размер и атрибуты) и предназначен для создания, копирования, перемещения и удаления файлов. Вдобавок к набору функциональности, унаследованной от FileSystemInfo, есть некоторые члены, уникальные для класса FileInfo, которые описаны ниже:

AppendText() Создает объект StreamWriter и добавляет текст в файл
СоруТо() Копирует существующий файл в новый файл
Create() Создает новый файл и возвращает объект FileStream для взаимодействия с вновь созданным файлом
CreateText() Создает объект StreamWriter, записывающий новый текстовый файл
Delete() Удаляет файл, к которому привязан экземпляр FileInfo
Directory Получает экземпляр родительского каталога
DirectoryName Получает полный путь к родительскому каталогу
Length Получает размер текущего файла или каталога
MoveTo() Перемещает указанный файл в новое местоположение, предоставляя возможность указать новое имя файла
Name Получает имя файла
Open() Открывает файл с различными привилегиями чтения/записи и совместного доступа
OpenRead() Создает доступный только для чтения объект FileStream
OpenText() Создает объект StreamReader и читает из существующего текстового файла
OpenWrite() Создает доступный только для записи объект FileStream

Обратите внимание, что большинство методов класса FileInfo возвращают специфический объект ввода-вывода (т.е. FileStream и StreamWriter), который позволяет начать чтение и запись данных в ассоциированный файл в разнообразных форматах.

Скоро мы рассмотрим эти типы; однако прежде чем увидеть работающий пример, давайте изучим различные способы получения дескриптора файла с использованием класса FileInfo.

Один из способов создания дескриптора файла предусматривает использование метода FileInfo.Create():

static void NewFile()
        {
            // Создаем новый файл
            FileInfo f = new FileInfo(@"C:\Test.dat");
            FileStream fs = f.Create();

            // Закрыть файловый поток
            fs.Close();
        }

Метод FileInfo.Create() возвращает тип FileStream, который предоставляет синхронную и асинхронную операции записи/чтения лежащего в его основе файла. Имейте в виду, что объект FileStream, возвращенный FileInfo.Create() открывает полный доступ по чтению и записи всем пользователям.

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

С помощью метода FileInfo.Open() можно открывать существующие файлы, а также создавать новые файлы с гораздо более высокой точностью, чем FileInfo.Create(), учитывая, что Open() обычно принимает несколько параметров для описания общей структуры файла, с которым будет производиться работа. В результате вызова Open() получается возвращенный им объект FileStream. Взгляните на следующую логику:

FileInfo f2 = new FileInfo(@"C:\Test1.dat");
using (FileStream fs2 = f2.Open(FileMode.OpenOrCreate,
       FileAccess.ReadWrite, FileShare.None)) { };

Эта версия перегруженного метода Open() требует трех параметров. Первый параметр указывает общий тип запроса ввода-вывода (т.е. создать новый файл, открыть существующий файл и дописать в файл), указываемый в виде перечисления FileMode:

public enum FileMode
{
   CreateNew,
   Create,
   Open,
   OpenOrCreate,
   Truncate,
   Append
}

Второй параметр метода Open() — значение перечисления FileAccess — используется для определения поведения чтения/записи лежащего в основе потока. И, наконец, третий параметр метода Open() — FileShare — указывает, как файл может быть разделен с другими файловыми дескрипторами.

Хотя метод FileInfo.Open() позволяет получить дескриптор файла довольно гибким способом, в классе FileInfo также предусмотрены для этого члены OpenRead() и OpenWrite(). Как и можно было ожидать, эти методы возвращают объект FileStream, соответствующим образом сконфигурированный только для чтения или только для записи, без необходимости применять различные значения перечислений.

Еще один член типа FileInfo, связанный с открытием файлов — OpenText(). В отличие от Create(), Open(), OpenRead() и OpenWrite(), метод OpenText() возвращает экземпляр типа StreamReader, а не FileStream.

Тип File предоставляет функциональность, почти идентичную типу FileInfo, с помощью нескольких статических методов. Подобно FileInfo, тип File поддерживает методы AppendText(), Create(), CreateText(), Open(), OpenRead(), OpenWrite() и OpenText(). Тип File также поддерживает несколько уникальных членов, перечисленных ниже, которые могут значительно упростить процесс чтения и записи текстовых данных:

ReadAllBytes()

Открывает указанный файл, возвращает двоичные данные в виде массива байт и затем закрывает файл

ReadAllLines()

Открывает указанный файл, возвращает символьные данные в виде массива строк, затем закрывает файл

ReadAllText()

Открывает указанный файл, возвращает символьные данные в виде System.String(), затем закрывает файл

WriteAllBytes()

Открывает указанный файл, записывает в него байтовый массив и закрывает файл

WriteAllLines()

Открывает указанный файл, записывает в него массив строк и закрывает файл

WriteAllText()

Открывает указанный файл, записывает в него данные из указанной строки и закрывает файл

Отсюда вывод: когда необходимо быстро получить файловый дескриптор, тип File сэкономит некоторый объем ввода. Однако преимущество предварительного создания объекта FileInfo связано с возможностью исследования файла с использованием членов абстрактного базового класса FileSystemInfo.

Пройди тесты
Лучший чат для C# программистов