File c что это
Перейти к содержимому

File c что это

  • автор:

Тип данных FILE

Этот тип данных определяет поток и содержит информацию, необходимую для управления потоком, в том числе указатель на буфер потока, и его показатели состояния.

Файловые объекты обычно создаются с помощью вызова функций fopen или tmpfile , которые возвращают ссылку на объект связанный с файлом.

Содержимое объекта FILE предназначено для использования только функций определённых в заголовочном файле <cstdio> . В самом деле, основной целью объекта типа FILE является идентификации и потока, который связан с физическим файлом. Во всех потоковых функциях, в качестве аргумента передается объект типа FILE , таким образом мы можем передавать потоки в функции, и выполнять различные манипуляции с ними.

Объект типа FILE в памяти размещается автоматически, эта задача лежит на функциях fopen или tmpfile . Задача высвобождения памяти выполняется функцией fclose .

При подключении заголовочного файла <cstdio> в проект, автоматически создаются три объекта типа FILE* , потоки ввода/вывода и стандартный поток ошибок. К этим потокам можно обратиться через указатели stdin , stdout и stderr .

Пример: исходный код программы

Эта программа считывает данные из текстового файла file.txt и отправляет считанные данные в стандартный поток вывода.

Что-то в этой цитате есть, что заставляет задуматься, не помню, кто это сказал, но в этом предложении заложен глубокий смысл.

File c что это

Подобно паре Directory/DirectoryInfo для работы с файлами предназначена пара классов File и FileInfo . С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.

FileInfo

Некоторые полезные методы и свойства класса FileInfo :

CopyTo(path) : копирует файл в новое место по указанному пути path

Create() : создает файл

Delete() : удаляет файл

MoveTo(destFileName) : перемещает файл в новое место

Свойство Directory : получает родительский каталог в виде объекта DirectoryInfo

Свойство DirectoryName : получает полный путь к родительскому каталогу

Свойство Exists : указывает, существует ли файл

Свойство Length : получает размер файла

Свойство Extension : получает расширение файла

Свойство Name : получает имя файла

Свойство FullName : получает полное имя файла

Для создания объекта FileInfo применяется конструктор, который получает в качестве параметра путь к файлу:

Класс File реализует похожую функциональность с помощью статических методов:

Copy() : копирует файл в новое место

Create() : создает файл

Delete() : удаляет файл

Move : перемещает файл в новое место

Exists(file) : определяет, существует ли файл

Пути к файлам

Для работы с файлами можно применять как абсолютные, так и относительные пути:

Получение информации о файле

Удаление файла

Перемещение файла

Если файл по новому пути уже существует, то с помощью дополнительного параметра можно указать, надо ли перезаписать файл (при значении true файл перезаписывается)

Копирование файла

Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true , как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false , то если такой файл уже существует, приложение выдаст ошибку.

Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.

Чтение и запись файлов

В дополнение к вышерассмотренным методам класс File также предоставляет ряд методов для чтения-записи текстовых и бинарных файлов:

AppendAllLines(String, IEnumerable<String>) / AppendAllLinesAsync(String, IEnumerable<String>, CancellationToken)

добавляют в файл набор строк. Если файл не существует, то он создается

AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken)

добавляют в файл строку. Если файл не существует, то он создается

byte[] ReadAllBytes (string path) / Task<byte[]> ReadAllBytesAsync (string path, CancellationToken cancellationToken)

считывают содержимое бинарного файла в массив байтов

string[] ReadAllLines (string path) / Task<string[]> ReadAllLinesAsync (string path, CancellationToken cancellationToken)

считывают содержимое текстового файла в массив строк

string ReadAllText (string path) / Task<string> ReadAllTextAsync (string path, CancellationToken cancellationToken)

считывают содержимое текстового файла в строку

IEnumerable<string> ReadLines (string path)

считывают содержимое текстового файла в коллекцию строк

void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken)

записывают массив байт в бинарный файл. Если файл не существует, он создается. Если существует, то перезаписывается

void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable<string> contents, CancellationToken cancellationToken)

записывают массив строк в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается

WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken)

записывают строку в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается

Как видно, эти методы покрывают практически все основные сценарии — чтение и запись текстовых и бинарных файлов. Причем в зависимости от задачи можно применять как синхронные методы, так и их асинхронные аналоги.

Например, запишем и считаем обратно в строку текстовый файл:

Стоит отметить, что при добавлении текста я добавил в строку последовательность «\n», которая выполняет перевод на следующую строку. Благодаря этому добавляемый текст располагается в файле на новой строке.

Если мы хотим, что в файле изначально шло добавление на новую строку, то для записи стоит использовать метод WriteAllLines/ WriteAllLinesAsync , а для добавления — AppendAllLines / AppendAllLinesAsync

Аналогично при чтении файла если мы хотим каждую строку файла считать отдельно, то вместо ReadAllText / ReadAllTextAsync применяется ReadAllLines / ReadAllLinesAsync .

File c что это

Object type that identifies a stream and contains the information needed to control it, including a pointer to its buffer, its position indicator and all its state indicators.

FILE objects are usually created by a call to either fopen or tmpfile, which both return a pointer to one of these objects.

The content of a FILE object is not meant to be accessed from outside the functions of the <cstdio> and <cwchar> headers; In fact, portable programs shall only use them in the form of pointers to identify streams, since for some implementations, even the value of the pointer itself could be significant to identify the stream (i.e., the pointer to a copy of a FILE object could be interpreted differently than a pointer to the original).

Its memory allocation is automatically managed: it is allocated by either fopen or tmpfile, and it is the responsibility of the library to free the resources once either the stream has been closed using fclose or the program terminates normally.

On inclusion of the <cstdio> header file, three objects of this type are automatically created, and pointers to them are declared: stdin, stdout and stderr, associated with the standard input stream, standard output stream and standard error stream, respectively.

Классы 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():

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

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

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

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

Второй параметр метода 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.

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

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