Полное руководство. С# 4.0 - Шилдт Герберт
Шрифт:
Интервал:
Закладка:
Для выполнения операций ввода-вывода с запоминанием в некоторых приложениях в качестве базовой памяти иногда лучше использовать массив типа string, чеммассив типа byte. Именно для таких случаев и предусмотрены классы StringReaderи StringWriter. В частности, класс StringReader наследует от класса TextReader,а класс StringWriter — от класса TextWriter. Следовательно, они представляют собой потоки, имеющие доступ к методам, определенным в этих двух базовыхклассах, что позволяет, например, вызывать метод ReadLine() для объекта классаStringReader, а метод WriteLine() — для объекта класса StringWriter.
Ниже приведен конструктор класса StringReader:StringReader(string s)
где s обозначает символьную строку, из которой производится чтение.
В классе StringWriter определено несколько конструкторов. Ниже представленодин из наиболее часто используемых.StringWriter()
Этот конструктор создает записывающий поток, который помещает выводимыеданные в строку. Для получения содержимого этой строки достаточно вызвать методToString().
Ниже приведен пример, демонстрирующий применение классов StringReaderи StringWriter.// // Продемонстрировать применение классов StringReader и StringWriter.using System;using System.IO;class StrRdrWtrDemo { static void Main() { StringWriter strwtr = null; StringReader strrdr = null; try { // Создать объект класса StringWriter. strwtr = new StringWriter(); // Вывести данные в записывающий поток типа StringWriter. for (int i=0; i < 10; i++) strwtr.WriteLine("Значение i равно: " + i); // Создать объект класса StringReader. strrdr = new StringReader(strwtr.ToString()); //А теперь ввести данные из считывающего потока типа StringReader. string str = strrdr.ReadLine(); while(str != null) { str = strrdr.ReadLine(); Console.WriteLine(str); } } catch(IOException exc) { Console.WriteLine("Ошибка ввода-выводаn" + exc.Message); } finally { // Освободить ресурсы считывающего и записывающего потоков. if(strrdr != null) strrdr.Close(); if(strwtr != null) strwtr.Close(); } }}
Вот к каком результату приводит выполнение этого кода.Значение i равно: 1Значение i равно: 2Значение i равно: 3Значение i равно: 4Значение i равно: 5Значение i равно: 6Значение i равно: 7Значение i равно: 8Значение i равно: 9
В данном примере сначала создается объект strwtr класса StringWriter, в который выводятся данные с помощью метода WriteLine(). Затем создается объект классаStringReader с использованием символьной строки, содержащейся в объекте strwtr.Эта строка получается в результате вызова метода ToString() для объекта strwtr.И наконец, содержимое данной строки считывается с помощью метода ReadLine().Класс File
В среде .NET Framework определен класс File, который может оказаться полезнымдля работы с файлами, поскольку он содержит несколько статических методов, выполняющих типичные операции над файлами. В частности, в классе File имеются методыдля копирования и перемещения, шифрования и расшифровывания, удаления файлов, а также для получения и задания информации о файлах, включая сведения об ихсуществовании, времени создания, последнего доступа и различные атрибуты файлов(только для чтения, скрытых и пр.). Кроме того, в классе File имеется ряд удобных методов для чтения из файлов и записи в них, открытия файла и получения ссылки типаFileStream на него. В классе File содержится слишком много методов для подробного их рассмотрения, поэтому мы уделим внимание только трем из них. Сначала будет представлен метод Сору(), а затем — методы Exists() и GetLastAccessTime().На примере этих методов вы сможете получить ясное представление о том, насколько удобны методы, доступные в классе File. И тогда вам станет ясно, что класс Fileопределенно заслуживает более тщательного изучения.
СОВЕТРяд методов для работы с файлами определен также в классе FileInfo. Этот класс отличается от класса File одним, очень важным преимуществом: для операций над файлами он предоставляет методы экземпляра и свойства, а не статические методы. Поэтому для выполнениянескольких операций над одним и тем же файлом лучше воспользоваться классом FileInfo.Копирование файлов с помощью метода Сору()
Ранее в этой главе демонстрировался пример программы, в которой файл копировался вручную путем чтения байтов из одного файла и записи в другой. И хотя задачакопирования файлов не представляет особых трудностей, ее можно полностью автоматизировать с помощью метода Сору(), определенного в классе File. Ниже представлены две формы его объявления.static void Copy (string имя_исходного_файла, string имя_целевого_файла)static void Copy (string имя_исходного_файла, string имя_целевого_файла, boolean overwrite)
Метод Copy() копирует файл, на который указывает имяисходногофайла,в файл, на который указывает имяцелевогофайла. В первой форме данный методкопирует файл только в том случае, если файл, на который указывает имяцелево-гофайла, еще не существует. А во второй форме копия заменяет и перезаписываетцелевой файл, если он существует и если параметр overwrite принимает логическоезначение true. Но в обоих случаях может быть сгенерировано несколько видов исключений, включая IOException и FileNotFoundException.
В приведенном ниже примере программы метод Сору() применяется для копирования файла. Имена исходного и целевого файлов указываются в командной строке.Обратите внимание, насколько эта программа короче демонстрировавшейся ранее.Кроме того, она более эффективна./* Скопировать файл, используя метод File.Copy(). Чтобы воспользоваться этой программой, укажите имя исходного и целевого файлов. Например, чтобы скопировать файл FIRST.DAT в файл SECOND.DAT, введите в командной строке следующее: CopyFile FIRST.DAT SECOND.DAT*/using System;using System.IO;class CopyFile { static void Main(string[] args) { if(args.Length != 2) { Console.WriteLine("Применение : CopyFile Откуда Куда"); return; } // Копировать файлы. try { File.Copy(args[0], args[1]); } catch(IOException exc) { Console.WriteLine("Ошибка копирования файлаn" + exc.Message); } }}
Как видите, в этой программе не нужно создавать поток типа FileStream илиосвобождать его ресурсы. Все это делается в методе Сору() автоматически. Обратитетакже внимание на то, что в данной программе существующий файл не перезаписывается. Поэтому если целевой файл должен быть перезаписан, то для этой цели лучшевоспользоваться второй из упоминавшихся ранее форм метода Сору().Применение методов Exists() и GetLastAccessTime()
С помощью методов класса File очень легко получить нужные сведения о файле.Рассмотрим два таких метода: Exists() и GetLastAccessTime(). Метод Exists()определяет, существует ли файл, а метод GetLastAccessTime() возвращает дату и время последнего доступа к файлу. Ниже приведены формы объявления обоих методов.static bool Exists(string путь)static DateTime GetLastAccessTime(string путь)
В обоих методах путь обозначает файл, сведения о котором требуется получить.Метод Exists() возвращает логическое значение true, если файл существует и доступен для вызывающего процесса. А метод GetLastAccessTime() возвращает структуру DateTime, содержащую дату и время последнего доступа к файлу. (СтруктураDateTime описывается далее в этой книге, но метод ToString() автоматически приводит дату и время к удобочитаемому виду.) С указанием недействительных аргументов или прав доступа при вызове обоих рассматриваемых здесь методов может бытьсвязан целый ряд исключений, но в действительности генерируется только исключение IOException.
В приведенном ниже примере программы методы Exists() и GetLastAccessTime()демонстрируются в действии. В этой программе сначала определяется, существует лифайл под названием test.txt. Если он существует, то на экран выводит время последнего доступа к нему.// Применить методы Exists() и GetLastAccessTime().using System;using System.IO;class ExistsDemo { static void Main() { if(File.Exists("test.txt")) Console.WriteLine("Файл существует. В последний раз он был доступен " + File.GetLastAccessTime("test.txt")); else Console.WriteLine("Файл не существует"); }}