Классы File и FileInfo
92C# и .NET --- Многопоточность и файлы --- Классы File и FileInfo
Класс 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.