Поделиться через


Операции ввода-вывода файлов и потоковой передачи данных

Операции ввода-вывода файлов и потоков обозначают передачу данных к носителю хранения или из него. В .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 служат абстрактными базовыми классами для других читателей и писателей, которые считывают и записывают символы и строки, но не двоичные данные.

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

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

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

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

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

Сжатие

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

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

  • ZipArchive — для создания и получения записей в ZIP-архиве.

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

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

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

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

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

См. Как сжимать и извлекать файлы.

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

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

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

При реализации изолированного хранилища часто используются следующие классы:

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

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

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

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

Операции ввода-вывода в приложениях Магазина Windows

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

Некоторые важные различия при использовании операций ввода-вывода в приложениях Магазина Windows 8.x:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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