Узнайте, как читать и записывать файлы и потоки, 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: Если вы найдете эту историю полезной, я предлагаю вам нажать кнопку «Аплодисменты» и поделиться ею. Кроме того, я был бы рад видеть вас в качестве моего нового подписчика!