Класс System.IO.FileStream

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

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

Важно!

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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