Файловый и потоковый ввод-вывод

Файловый и потоковый ввод-вывод относятся к передаче данных с носителя информации или на него. В .NET пространства имен System.IO содержат типы, которые обеспечивают как синхронные, так и асинхронные операции чтения и записи для потоков и файлов. Кроме того, эти пространства имен содержат типы, выполняющие сжатие и распаковку файлов, а также типы, которые обеспечивают взаимодействие через каналы и последовательные порты.

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

Файлы и каталоги

Типы в пространстве имен System.IO можно использовать для взаимодействия с файлами и каталогами. Например, можно получать и задавать свойства файлов и каталогов, а также извлекать коллекции файлов и каталогов на основе критерия поиска.

Соглашения об именовании и способы указания пути к файлу в системах Windows, включая синтаксис устройств DOS, поддерживаемый в .NET Core 1.1 и более поздних версиях и платформе .NET Framework 4.6.2 и более поздних версиях, см. в статье Форматы путей файлов в системах Windows.

Ниже перечислены некоторые часто используемые классы для файлов и каталогов:

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

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

  • Directory предоставляет статические методы для создания, перемещения и перечисления в каталогах и подкаталогах.

  • DirectoryInfo предоставляет методы экземпляра для создания, перемещения и перечисления в каталогах и подкаталогах.

  • Path предоставляет методы и свойства для обработки строк каталогов межплатформенным способом.

При вызове методов для работы с файловой системой следует всегда использовать надежные механизмы обработки исключений. Дополнительные сведения см. в разделе об обработке ошибок ввода-вывода.

Помимо использования этих классов, пользователи Visual Basic могут использовать методы и свойства, предоставляемые классом Microsoft.VisualBasic.FileIO.FileSystem для файлового ввода-вывода.

См. практическое руководство по Копирование каталогов, Практическое руководство. Создание списка каталогов и Практическое руководство. перечислить каталоги и файлы.

Потоки

Абстрактный базовый класс Stream поддерживает чтение и запись байтов. Все классы, представляющие потоки, являются производными от класса Stream. Класс Stream и его производные классы обеспечивают общий способ просмотра источников данных и хранилищ объектов, а также изолируют программиста от специфических особенностей операционной системы и базовых устройств.

Потоки включают три основные операции:

  • Чтение — перенос информации из потока в структуру данных, такую как массив байтов.

  • Запись — перенос данных в поток из источника данных.

  • Поиск — определение и изменение текущей позиции внутри потока.

В зависимости от базового источника или хранилища данных поток может поддерживать лишь некоторые из этих возможностей. Например, класс PipeStream не поддерживает поиск. Свойства CanRead, CanWrite и CanSeek потока определяют операции, поддерживаемые потоком.

Ниже перечислены некоторые часто используемые классы потока:

  • FileStream — для чтения и записи в файл.

  • IsolatedStorageFileStream — для чтения и записи в файл в изолированном хранилище.

  • MemoryStream — для чтения и записи в память в качестве резервного хранилища.

  • BufferedStream — для повышения быстродействия операций чтения и записи.

  • NetworkStream — для чтения и записи на сетевые сокеты.

  • PipeStream — для чтения и записи в анонимные и именованные каналы.

  • CryptoStream — для связи потоков данных с криптографическими преобразованиями.

Пример асинхронной работы с потоками см. в разделе Асинхронный файловый ввод-вывод.

Средства чтения и записи

Пространство имен System.IO также предоставляет типы для чтения закодированных символов из потоков и их записи в потоки. Как правило, потоки предназначены для ввода и вывода байтов. Типы чтения и записи обрабатывают преобразование закодированных символов в байты или из байтов, чтобы поток мог завершить операцию. Каждый класс чтения и записи связан с потоком, который можно получить с помощью свойства класса BaseStream.

Ниже перечислены некоторые часто используемые классы для чтения и записи:

  • BinaryReader и BinaryWriter — для чтения и записи простых типов данных, таких как двоичные значения.

  • StreamReader и StreamWriter — для чтения и записи символов с использованием закодированного значения для преобразования символов в байты или из байтов.

  • StringReader и StringWriter — для чтения и записи символов в строки или из строк.

  • TextReader и TextWriter используются в качестве абстрактных базовых классов для других средств чтения и записи, которые считывают и записывают символы и строки, а не двоичные данные.

См. практическое руководство по Считывание текста из файла, Практическое руководство. Запись текста в файл, Практическое руководство. Считывание символов из строки и Практическое руководство. Запись символов в строку.

Асинхронные операции ввода-вывода

Чтение и запись больших объемов данных может быть ресурсоемкой. Эти задачи необходимо выполнять асинхронно, если приложение должно продолжать отвечать на запросы пользователя. В случае синхронных операций ввода-вывода поток пользовательского интерфейса будет заблокирован до тех пор, пока ресурсоемкая операция не завершится. При разработке приложений Microsoft Store для Windows 8.x используйте асинхронные операции ввода-вывода, чтобы не создавалось впечатления, что приложение прекратило свою работу.

Имена асинхронных элементов содержат Async, например: CopyToAsync, FlushAsync, ReadAsync и WriteAsync. Используйте эти методы с ключевыми словами async и await.

Дополнительные сведения см. в разделе Асинхронный файловый ввод-вывод.

Сжатие

Сжатием называется процесс сокращения размера сохраняемого файла. Распаковка — это процесс извлечения содержимого сжатого файла, что приводит его в формат, пригодный для использования. Пространство имен System.IO.Compression содержит типы для сжатия и распаковки файлов и потоков.

При сжатии и распаковке файлов и потоков часто используются следующие классы:

  • ZipArchive — для создания и восстановления содержимого ZIP-архива.

  • ZipArchiveEntry — для представления сжатого файла.

  • ZipFile — для создания, извлечения и открытия сжатого пакета.

  • ZipFileExtensions — для создания и извлечения содержимого из сжатого пакета.

  • DeflateStream — для сжатия и распаковки потоков с помощью алгоритма Deflate.

  • GZipStream — для сжатия и распаковки потоков в формате gzip.

См. практическое руководство по Сжатие и извлечение файлов.

Изолированное хранилище

Изолированное хранилище — это механизм хранения данных, обеспечивающий изоляцию и безопасность путем определения стандартизованных способов сопоставления кода с хранимыми данными. Хранилище предоставляет виртуальную файловую систему, изолированную по пользователю, сборке и (необязательно) домену. Изолированное хранилище особенно полезно в том случае, когда приложение не имеет разрешения на доступ к файлам пользователя. Можно сохранить параметры или файлы для приложения таким способом, который контролируется политикой безопасности компьютера.

Изолированное хранилище недоступно для приложений Microsoft Store для Windows 8.x. Вместо этого используйте классы данных приложения в пространстве имен Windows.Storage. Дополнительные сведения см. в разделе Данные приложения.

Часто используются следующие классы, реализующие изолированное хранилище:

  • IsolatedStorage предоставляет базовый класс для реализации изолированного хранилища.

  • IsolatedStorageFile предоставляет область изолированного хранилища, в которой содержатся файлы и каталоги.

  • IsolatedStorageFileStream представляет файл в изолированном хранилище.

См. раздел Изолированное хранилище.

Операции ввода-вывода в приложениях Microsoft Store

.NET для приложений Магазина Windows 8.x содержит множество типов для чтения и записи в потоки, однако этот набор содержит не все типы ввода-вывода .NET.

Следует отметить некоторые важные различия в использовании операций ввода-вывода в приложениях Microsoft Store для Windows 8.x:

  • Специальные типы, относящиеся к операциям с файлами, такие как File, FileInfo, Directory и DirectoryInfo, не включены в .NET для приложений Магазина Windows 8.x. Вместо этого используйте типы в пространстве имен Windows.Storage среды выполнения Windows, например StorageFile и StorageFolder.

  • Изолированное хранилище недоступно; вместо этого используйте данные приложения.

  • Используйте асинхронные методы, такие как ReadAsync и WriteAsync, чтобы предотвратить блокировку потока пользовательского интерфейса.

  • Типы сжатия на основе пути ZipFile и ZipFileExtensions недоступны. Вместо этого используйте типы в пространстве имен Windows.Storage.Compression.

При необходимости можно осуществлять преобразование между потоками .NET Framework и потоками среды выполнения Windows. Дополнительные сведения см. в разделе Практическое руководство. Преобразование между потоками .NET Framework и потоками среды выполнения Windows или WindowsRuntimeStreamExtensions.

Дополнительные сведения об операциях ввода-вывода в приложении Microsoft Store для Windows 8.x: Краткое руководство. Чтение и запись файлов.

Ввод-вывод и безопасность

При использовании классов в пространстве имен System.IO необходимо выполнить требования безопасности операционной системы, такие как списки управления доступом для контроля доступа к файлам и каталогам. Это требование дополняет остальные требования FileIOPermission. Списками управления доступом можно управлять программно. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление записей списка управления доступом.

По умолчанию политика безопасности не позволяет обращаться к файлам на компьютере пользователя через Интернет или из приложений интрасети. Поэтому при составлении кода не используйте классы ввода-вывода, которым требуется путь к физическому файлу, загружаемому через Интернет или интрасеть. Вместо этого используйте изолированное хранилище для приложений .NET.

Проверка безопасности выполняется только при создании потока. Поэтому не рекомендуется открывать поток, а затем передавать его коду с меньшим уровнем доверия или доменам приложений.

  • Распространенные задачи ввода-вывода
    Содержит список задач ввода-вывода, связанных с файлами, каталогами и потоками, а также ссылки на соответствующее содержимое и примеры для каждой задачи.

  • Асинхронный файловый ввод-вывод
    Описывает преимущества и основные операции асинхронного ввода и вывода.

  • Изолированное хранилище
    Описывает механизм хранения данных, обеспечивающий автономность и безопасность путем определения стандартизованных способов сопоставления кода с защищенными данными.

  • Каналы
    Описывает операции с анонимными и именованными каналами в .NET.

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