Класс System.IO.FileStream

Замечание

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

FileStream Используйте класс для чтения, записи, открытия и закрытия файлов в файловой системе, а также для управления другими дескрипторами операционной системы, связанными с файлами, включая каналы, стандартные входные данные и стандартные выходные данные. Для выполнения синхронных операций можно использовать методы Read, Write, CopyTo, и Flush, а для выполнения асинхронных операций — методы ReadAsync, WriteAsync, CopyToAsync, и FlushAsync. Используйте асинхронные методы для выполнения ресурсоемких операций с файлами без блокировки основного потока. Это особенно важно в приложении для Магазина Windows 8.x или классическом приложении, где времязатратная операция потока может заблокировать поток пользовательского интерфейса и создать впечатление, что приложение не работает. FileStream буферизирует входные и выходные данные для повышения производительности.

Это важно

Этот тип реализует IDisposable интерфейс. Завершив использование типа, следует избавиться от него напрямую или косвенно. Чтобы удалить тип напрямую, вызовите его Dispose метод в блоке try/catch . Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в IDisposable разделе интерфейса.

Свойство IsAsync определяет, был ли дескриптор файла открыт асинхронно. Это значение указывается при создании экземпляра FileStream класса с помощью конструктора, имеющего isAsyncuseAsyncили options параметр. При использовании trueсвойства поток использует перекрывающиеся операции ввода-вывода для асинхронного выполнения операций файлов. Однако для вызова метода IsAsync, true или ReadAsync не обязательно, чтобы свойство WriteAsync было CopyToAsync. Когда свойство IsAsyncfalse, и вы вызываете асинхронные операции чтения и записи, поток пользовательского интерфейса по-прежнему не блокируется, но фактические операции ввода-вывода выполняются синхронно.

Метод Seek поддерживает случайный доступ к файлам. Seek позволяет переместить позицию чтения и записи в любую позицию в файле. Это делается, используя параметры смещения байтов как точку отсчёта. Смещение байтов относительно точки отсчета поиска, которая может быть началом, текущей позицией или концом основного файла, как это представлено тремя элементами SeekOrigin перечисления.

Замечание

Файлы дисков всегда поддерживают случайный доступ. Во время построения CanSeek значение свойства задано true или false в зависимости от базового типа файла. Если базовый тип файла FILE_TYPE_DISK, как определено в winbase.h, CanSeek значение свойства равно true. CanSeek В противном случае значение свойства равноfalse.

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

См. классы File, Directory и Path для операций с каталогами и другими файлами. Класс File — это класс служебной FileStream программы, который имеет статические методы в первую очередь для создания объектов на основе путей к файлам. Класс MemoryStream создает поток из массива байтов и похож на FileStream класс.

Список общих операций с файлами и каталогами см. в разделе "Общие задачи ввода-вывода".

Обнаружение изменений положения потока

FileStream Если объект не имеет монопольного удержания на дескрипторе, другой поток может получить доступ к дескриптору файла одновременно и изменить положение указателя файла операционной системы, связанного с дескриптором файла. В этом случае кэшированные позиции в объекте FileStream и кэшированные данные в буфере могут быть скомпрометированы. Объект FileStream обычно выполняет проверки методов, которые обращаются к кэшированному буферу, чтобы убедиться, что позиция дескриптора операционной системы совпадает с используемой объектом FileStream кэшированной позицией.

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

Если в вызове метода Write обнаруживается непредвиденное изменение позиции дескриптора, содержимое буфера удаляется и выбрасывается исключение IOException.

Объект FileStream не будет иметь монопольное владение дескриптором, если свойство SafeFileHandle используется для доступа к дескриптору или если объекту FileStream присваивается свойство SafeFileHandle в его конструкторе.