Страница 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("Это тест.");</b>
<b> }</b>
<b>}</b>
Если выполнить эту программу из командной строки Test > log то символьная строка "Это тест." будет выведена в файл log. Аналогичным образом переадресуется ввод. Но для переадресации ввода указываемый источник входных данных должен удовлетворять требованиям программы, иначе она "зависнет".
Операторы < и >, выполняющие переадресацию из командной строки, не являются составной частью С#, а предоставляются операционной системой. Поэтому если в рабочей среде поддерживается переадресация ввода-вывода, как, например, в 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("logfile.txt");</b>
<b> // Переадресовать стандартный вывод в файл logfile.txt.</b>
<b> Console.SetOut(log_out);</b>
<b> Console.WriteLine("Это начало файла журнала регистрации.");</b>
<b> for(int i=0; i<10; i++) Console.WriteLine(i);</b>
<b> Console.WriteLine("Это конец файла журнала регистрации.");</b>
<b> } catch(IOException exc) {</b>
<b> Console.WriteLine("Ошибка ввода-вывода" + 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>