Добавить в цитаты Настройки чтения

Страница 210 из 502

где путь — это имя открываемого файла, включая полный путь к нему. Указываемый файл должен существовать. В противном случае генерируется исключение FileNotFoundException. Если путь оказывается пустым, то генерируется исключение ArgumentNullException. А если путь содержит пустую строку, то генерируется исключение ArgumentException. Кроме того, могут быть сгенерированы исключения IOException и DirectoryNotFoundException.

Переадресация стандартных потоков

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

Переадресация стандартных потоков достигается двумя способами. Прежде всего, это делается при выполнении программы из командной строки с помощью операторов < и >, переадресовывающих потоки Console.In и Console.Out соответственно. Допустим, что имеется следующая программа.

<b>using System;</b>

<b>class Test {</b>

<b>  static void Main() {</b>

<b>    Console.WriteLine(&quot;Это тест.&quot;);</b>

<b>  }</b>

<b>}</b>

Если выполнить эту программу из командной строки Test &gt; log то символьная строка "Это тест." будет выведена в файл log. Аналогичным образом переадресуется ввод. Но для переадресации ввода указываемый источник входных данных должен удовлетворять требованиям программы, иначе она "зависнет".

Операторы &lt; и &gt;, выполняющие переадресацию из командной строки, не являются составной частью С#, а предоставляются операционной системой. Поэтому если в рабочей среде поддерживается переадресация ввода-вывода, как, например, в Windows, то стандартные потоки ввода и вывода можно переадресовать, не внося никаких изменений в программу. Тем не менее существует другой способ, позволяющий осуществлять переадресацию стандартных потоков под управлением самой программы. Для этого служат приведенные ниже методы SetIn(), SetOut() и SetError(), являющиеся членами класса Console.

<b>static void SetIn(TextReader новый_поток_ввода) </b>

<b>static void SetOut(TextWriter новый_поток_вывода)</b>

<b>static void SetError(TextWriter новый_поток_сообщений_об_ошибках)</b>

Таким образом, для переадресации ввода вызывается метод SetIn() с указанием требуемого потока. С этой целью может быть использован любой поток ввода, при условии, что он является производным от класса TextReader. А для переадресации вывода вызывается метод SetOut() с указанием требуемого потока вывода, который должен быть также производным от класса TextReader. Так, для переадресации вывода в файл достаточно указать объект класса FileStream, заключенный в оболочку класса StreamWriter. Соответствующий пример программы приведен ниже.

<b>// Переадресовать поток Console.Out.</b>

<b>using System;</b>

<b>using System.IO;</b>

<b>class Redirect {</b>

<b>  static void Main() {</b>

<b>    StreamWriter log_out = null;</b>

<b>    try {</b>

<b>      log_out = new StreamWriter(&quot;logfile.txt&quot;);</b>

<b>      // Переадресовать стандартный вывод в файл logfile.txt.</b>

<b>      Console.SetOut(log_out);</b>

<b>      Console.WriteLine(&quot;Это начало файла журнала регистрации.&quot;);</b>

<b>      for(int i=0; i&lt;10; i++) Console.WriteLine(i);</b>

<b>      Console.WriteLine(&quot;Это конец файла журнала регистрации.&quot;);</b>

<b>    } catch(IOException exc) {</b>

<b>      Console.WriteLine(&quot;Ошибка ввода-вывода&quot; + exc.Message);</b>

<b>    } finally {</b>

<b>      if(log_out != null) log_out.Close();</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

При выполнении этой программы на экран ничего не выводится, но файл logfile. txt будет содержать следующее.

<b>Это начало файла журнала регистрации.</b>

<b>0</b>

<b>1</b>

<b>2</b>

<b>3</b>

<b>4</b>

<b>5</b>

<b>6</b>

<b>7</b>

<b>8</b>

<b>9</b>

<b>Это конец файла журнала регистрации.</b>