Узнайте, как читать и записывать файлы и потоки, HTTP-вызовы и асинхронные операции ввода-вывода.

Привет, народ!

В этой истории будет обсуждаться Цель 4.1: Выполнение операций ввода-вывода! Я надеюсь, вам понравится это!

В последнем рассказе была представлена ​​Цель 3.5: Реализовать диагностику в приложении.

Весь код серии сертификации можно найти здесь.

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

Во время карьеры разработчика нередко приходится управлять файлами с помощью C#. Возможно, вам нужно было прочитать файл .csv и получить список данных или экспортировать данные JSON в файловую систему. В любом случае, изучение выполнения таких задач, как чтение и создание файлов и каталогов, а также их информации, может быть полезным.

Все, что вам нужно, находится в пространстве имен System.IO.

Каталоги

Если вы хотите управлять каталогами, вам понадобится класс DirectoryInfo или статический класс Directory. Они позволяют выполнять такие операции, как создание, перемещение и перебор каталогов (и их подкаталогов, если таковые имеются).

Если вы не укажете абсолютный URL-адрес, базовый URL-адрес по умолчанию будет ‹Project›/bin/Debug.

В приведенном выше коде показано, как проверить, существуют ли два каталога, а также создать, переместить один в другой и, наконец, удалить папку с именем «каталог». Однако важно отметить, что при попытке удалить несуществующую папку возникает DirectoryNotFoundException. Кроме того, попытка переместить каталог в другой, который уже существует, вызовет System.IO.IOException.

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

Файлы

Теперь, если вы хотите управлять файлами, вам понадобится либо класс FileInfo, либо статический класс File (аналогичный классу каталогов!).

В приведенном ниже коде показано, как проверить наличие файла, удалить и получить информацию о метаданных файла.

Позже в этой истории я покажу вам, как перемещать и записывать файлы с помощью Streams.

Потоки

Хорошо, вы можете создать текстовый файл, используя классы File и FileInfo. Но как насчет чтения этого файла, его редактирования и сохранения новых данных? Для этого очень важно быть знакомым с классом Stream. Класс Stream позволяет выполнять операции ввода-вывода!

Три самые основные операции, которые вы можете выполнять с помощью Stream:

  • Чтение: массив байтов извлекается из данных файла, что позволяет преобразовать его в информацию. Например, это может быть текст или объект.
  • Запись: преобразуя данные в массив байтов, вы можете записать их в поток. Это позволяет вам сохранить его в файле или отправить по сети;
  • Seek: разрешает итерацию данных потока. Он имеет понятие «курсор», который представляет текущую позицию в потоке.

Класс StreamWriter позволяет записывать данные в файл. Это может быть текст, файл изображения и т. д. В приведенном ниже коде показано, как записать данные в новый файл.

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

В приведенном ниже коде показано, как записать данные в новый файл, а затем прочитать его содержимое.

Используя эти операции, вы также можете связать эти потоки. Например, при сжатии данных с помощью класса GZipStream необходимо использовать FileStream для записи несжатых данных. , второй FileStream для хранения его содержимого. Наконец, третий и последний, который является GZipStream, используется для записи сжатых данных в новый поток.

Запутался, да? Как насчет проверки кода ниже?

И это результат!

Чтение и запись из сети с использованием классов в пространстве имен System.Net.

Для чтения и записи данных по сети .NET Framework предлагает абстрактные классы WebRequest и WebResponse. Скорее всего, вы собираетесь использовать их ориентированные на HTTP реализации, которые представляют собой классы HttpWebRequest и HttpWebResponse.

В приведенном ниже коде показано, как принимать и отправлять запросы к JSONPlaceholder API (бесплатный REST APl для целей тестирования).

Приведенный выше код при выполнении приводит к:

Большинство известных мне разработчиков (включая меня) используют класс HttpClient. Так как он использует асинхронный вызов, я решил выложить его в соседнюю тему.

Реализовать асинхронные операции ввода-вывода

Некоторые операции ввода-вывода, такие как HTTP-запросы или чтение файлов, могут занять некоторое время. Проблема такой ситуации в том, что когда поток ожидает такого рода операций, он не может работать над другими запросами. Это может привести к проблеме, известной как «истощение пула потоков», когда все потоки заняты, и запросы начинают ставиться в очередь.

Асинхронные операции можно использовать, чтобы освободить основной поток для работы где-то, пока операция ввода/вывода не приносит результата. Используя ключевые слова async/await, вы можете указать компилятору выполнять код асинхронно. Асинхронный метод должен возвращать задачу, которую можно было бы ожидать с помощью ключевого слова await.

И результат такой же, как при использовании WebRequest! Но стоит отметить, что в этом случае нам не нужен StreamReader для чтения содержимого ответа.

Это все на данный момент!

Увидимся в следующей истории, где я расскажу о задаче 4.2: использование данных.

PS: Если вы найдете эту историю полезной, я предлагаю вам нажать кнопку «Аплодисменты» и поделиться ею. Кроме того, я был бы рад видеть вас в качестве моего нового подписчика!