26) Листинг 8.9 static void Main(string[] arqs) { // Получить объект FileStream через File.Create() . using(FileStream fs = File.Create(@"C:\Test.dat")) {} // Получить объект FileStream через File.Open(). using(FileStream fs2 = File.Open(@"C:\Test2.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) {} // Получить объект FileStream с правами только для чтения. using(FileStream readOnlyStream = File.OpenRead(@"Test3.dat")) { } //Получить объект FileStream с правами только для записи. using(FileStream writeOnlyStream = File.OpenWrite(@"Test4.dat") ) {} // Получить объект StreamReader. using(StreamPeader sreader = File.OpenText(@"C:\boot.mi")) {} // Получить несколько объектов StreamWriter. using (StreamWriter swriter = File.CreateText(@"C:\Test6.txt")) {} using(StreamWriter swriterAppend = File.AppendText(@"C:\FinalTest.txt")) {} } Таблица 8.6 – Методы типа File Метод Назначение Открывает указанный файл, возвращает двоичные данные в виде массива байт и затем закрывает файл Открывает указанный файл, возвращает символьные данные ReadAllLines() в виде массива строк, затем закрывает файл Открывает указанный файл, возвращает символьные данные ReadAllText() в виде System.String, затем закрывает файл Открывает указанный файл, записывает в него байтовый WriteAllBytes() массив и закрывает файл Открывает указанный файл, записывает в него массив строк WriteAllLines() и закрывает файл Открывает указанный файл, записывает в него данные из WriteAllText() указанной строки и закрывает файл ReadAllBytes() 28) Листинг 8.10 class Program { static void Main(stnng[] args) { Console.WriteLine ( "***** Simple 10 with the File Type *****\n"); string [] myTasks = { "Fix bathroom sink", "Call Dave", "Call Mom and Dad", "Play Xbox 360"}; // Записать все данные в файл на диске С. File.WriteAllLines(@"С:\tasks.txt", myTasks); // Прочитать все обратно и распечатать. foreach (string task in File.ReadAllLines(@"С:\tasks.txt")) { Console.WriteLine("TODO: {0}", task); } Console.ReadLine(); } } Член CanRead CanWrite CanSeek Close() Flush() Length Position Read() ReadByte() Seek() SetLength() Write() WriteByte() Назначение Определяют, поддерживает ли текущий поток чтение, запись или поиск Закрывает текущий поток и освобождает все ресурсы (такие как сокеты и файловые дескрипторы), ассоциированные с текущим потоком. Внутренне этот метод является псевдонимом метода Dispose(). Поэтому закрытие потока функционально эквивалентно освобождению потока Обновляет лежащий в основе источник данных или репозиторий текущим состоянием буфера с последующей очисткой буфера. Если поток не реализует буфер, метод ничего не делает Возвращает длину потока в байтах Определяет текущую позицию в потоке Читает последовательность байт (или одиночный байт) из текущего потока и перемещает текущую позицию потока на количество прочитанных байтов Устанавливает позицию в текущем потоке Устанавливает длину текущего потока Пишет последовательность байт (или одиночный байт) в текущий поток и перемещает текущую позицию потока на количество записанных байтов 30) Листинг 20.10 // Не забудьте импортировать пространства имен System.Text и System.IO! static void Main(string[] args) { Console.WriteLine("***** Fun with FileStreams *****\n"); // Получить объект FileStream. using(FileStream fStream = File.Open(@"C:\myMessage.dat",FileMode.Create)) { // Закодировать строку в виде массива байт. string msg = "Hello!"; byte[] msgAsByteArray = Encoding.Default.GetBytes(msg); // Записать byte[] в файл. fStream.Write(msgAsByteArray, 0, msgAsByteArray.Length); // Сбросить внутреннюю позицию потока. fStream.Position = 0; // Прочитать типы из файла и вывести на консоль. for (int i = 0; i < msgAsByteArray.Length; i++) { bytesFromFile[l] = (byte)fStream.ReadByte(); Console.Write(bytesFromFile[i]); } // Вывести декодированные сообщения. Console.Write("\nDecoded Message: " ) ; Console.WriteLine(Encoding.Default.GetString( bytesFromFile)); } Console.ReadLine(); } Таблица 8.8 – Основные члены TextWriter Член Назначение Close() Этот метод закрывает объект-писатель и освобождает все связанные с ним ресурсы. В процессе автоматически сбрасывается буфер (этот член функционально эквивалентен методу Dispose()) Flush() Этот метод очищает все буферы текущего объекта-писателя и записывает все буферизированные данные на лежащее в основе устройство, но не закрывает его NewLine Это свойство задает константу перевода строки для унаследованного класса писателя. По умолчанию ограничителем строки в Windows является возврат каретки, за которым следует перевод строки (\r\n) Write() WriteLine() Этот перегруженный метод записывает данные в текстовый поток без добавления константы новой строки Этот перегруженный метод записывает данные в текстовый поток с добавлением константы новой строки 33) Листинг 20.11 static void Main(string[] args) { Console.WriteLine( ***** Fun with StreamWriter/StreamReader *****\n"); // Получить StreamWriter и записать строковые данные. using(StreamWriter writer = File.CreateText("reminders.txt")) { writer.WriteLine("Don't forget Mother's Day this year..."); writer.WriteLine("Don't forget Father's Day this year..."); writer.WriteLine("Don't forget these numbers:"); for(int i = 0; l < 10; i++) writer.Write (i + " ") ; // Вставить новую строку. writer.Write(writer.NewLine); } Console.WriteLine("Created file and wrote some thoughts..."); Таблица 8.9 – Основные члены TextReader Член Назначение Peek() Возвращает следующий доступный символ, не изменяя текущей позиции читателя. Значение -1 указывает на достижение конца потока Read() Читает данные из входного потока ReadBlock() Читает указанное максимальное количество символов из текущего потока и записывает данные в буфер, начиная с заданного индекса Читает строку символов из текущего потока и возвращает данные в виде строки (null-строка указывает на признак конца файла (EOF)) Читает все символы от текущей позиции до конца потока и возвращает их в виде одной строки ReadLine() ReadToEnd() 35) Листинг 8.13 static void Main(string [] args) { Console. WriteLine ( "***** Fun with StreamWriter/StreamReader *****\n"); // Прочитать данные из файла. Console.WriteLine("Here are your thoughts:\n"); using(StreamReader sr = File.OpenText("reminders.txt")) { string input = null; while ( (input = sr.ReadLine()) != null) { Console.WriteLine (input); } } Console.ReadLine(); } 36) Листинг 8.14 static void Main(string[] args) { Console.WriteLine ( "***** Fun with StreamWriter/StreamReader *****\n"); // Получить StreamWriter и записать строковые данные. using(StreamWriter writer = new StreamWriter("reminders.txt")) { ... } // Прочитать данные из файла. using (StreamReader sr = new StreamReader("reminders.txt")) { ... } } 37) Листинг 8.15 static void Main (string[] args) { Console.WriteLine( "***** Fun with StringWriter/StringReader *****\n"); // Создать StringWriter и записать символьные // данные в память. using(StringWriter strWriter = new StringWriter()) { strWriter.WriteLine( "Don't forget Mother's Day this year..."); // Получить копию содержимого (хранящегося // в строке) и вывести на консоль. Console.WriteLine ( "Contents of StringWriter:\n{0}", strWriter); } Console.ReadLine(); } 38) Листинг 8.16 using (StringWriter strWriter = new StringWriter ()) { strWriter.WriteLine( "Don't forget Mother's Day this year..."); Console.WriteLine( "Contents of StringWriter:\n{0}", strWriter); // Получить внутренний StringBuilder. StringBuilder sb = strWriter.GetStringBuilder(); sb.Insert (0, "Hey!! ") ; Console.WriteLine ("-> {0}", sb.ToString()); sb.Remove (0, "Hey!! ".Length); Console.WriteLine ("-> {0}", sb.ToString()); } 39) Листинг 8.17 using (StringWriter strWriter = new StringWriter()) { strWriter.WriteLine ( "Don't forget Mother's Day this year..."); Console.WriteLine( "Contents of StringWriter:\n(0}", strWriter); // Читать данные из StringWriter. using (StringReader strReader = new StringReader(strWriter.ToString())) { string input = null; while ( (input = strReader.ReadLine()) !=null) { Console.WriteLine(input); } } } Таблица 8.10 – Основные члены BinaryWriter Член Назначение BaseStream Это свойство, предназначенное только для обеспечивает доступ к лежащему в основе используемому объектом BinaryWriter Close() Этот метод закрывает двоичный поток Flush() Этот метод выталкивает буфер двоичного потока Seek() Этот метод устанавливает позицию в текущем потоке Write() Этот метод пишет значение в текущий поток чтения, потоку, Таблица 8.11 – Основные члены BinaryReader Член BaseStream Назначение Это свойство, предназначенное только для обеспечивает доступ к лежащему в основе используемому объектом BinaryReader Close() Этот метод закрывает двоичный поток PeekChar() Этот метод возвращает следующий доступный символ без перемещения текущей позиции потока Этот метод читает заданный набор байт или символов и сохраняет их в переданном ему массиве Read() ReadXXXX() чтения, потоку, В классе BinaryReader определено множество методов чтения, которые извлекают из потока объекты различных типов (ReadBoolean(), ReadByte(), ReadInt32() и т. д.) 42) Листинг 8.18 static void Main(string [] args) { Console. WriteLine ( "***** Fun with Binary Writers / Readers *****\n"); // Открыть двоичную запись в файл. Filelnfo f = new Filelnfо("BinFile.dat") ; using (BinaryWriter bw = new BinaryWriter (f.OpenWnte ()) ) { // Вывести на консоль тип BaseStream (System.10.FileStream // в данном случае). Console.WriteLine("Base stream is: {0}", bw.BaseStream); // Создать некоторые данные для сохранения в файле. double aDouble = 1234.67; int anInt = 34567; string aString = "А, В, C"; // Записать данные. bw.Write(aDouble); bw.Write(anlnt); bw.Write(aString); } Console.ReadLine() ; } 43) Листинг 8.19 static void Main(string[] args) { Filelnfo f = new Filelnfо("BinFile.dat"); // Читать двоичные данные из потока. using(BinaryReader br = new BinaryReader(f.OpenRead()) ) { Console.WriteLine(br.ReadDouble()); Console.WriteLine(br.Readlnt32()); Console.WriteLine(br.ReadString()); } Console.ReadLine() ; } 44) public enum NotifyFilters { Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size, } 45) // Делегат FileSystemEventHandler должен указывать // на метод, соответствующий следующей сигнатуре. void MyNotificationHandler(object source, FileSystemEventArgs e) 46) // Делегат RenamedEventHandler должен указывать //на метод, соответствующий следующей сигнатуре. void MyNotificationHandler(object source, RenamedEventArgs e) 47) Листинг 8.20 static void Main(string[] args) { Console.WriteLine ( "***** The Amazing File Watcher App *****\n"); // Установить путь к каталогу, за которым нужно наблюдать. FileSystemWatcher watcher = new FileSystemWatcher(); try { watcher.Path = @"C:\MyFolder"; } catch(ArgumentException ex) { Console.WriteLine(ex.Message); return; } // Указать предметы наблюдения. watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Следить только за текстовыми файлами. watcher.Filter = "*.txt"; // Добавить обработчики событий. watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.Created += new FileSystemEventHandler(OnChanged); watcher.Deleted += new FileSystemEventHandler(OnChanged); watcher.Renamed += new RenamedEventHandler(OnRenamed); // Начать наблюдение за каталогом. watcher.EnableRaisingEvents = true; // Ожидать команды пользователя на завершение программы. Console.WriteLine(@"Press 'q' to quit app."); while(Console.Read()!='q'); } 48) static void OnChanged(object source, FileSystemEventArgs e) { // Показать, что сделано, если файл изменен, // создан или удален. Console.WriteLine ("File: {0} {1}'", e.FullPath, e.ChangeType); } static void OnRenamed(object source, RenamedEventArgs e) { // Показать, что файл был переименован. Console.WriteLine("File: {0} renamed to\n{1}" , e.OldFullPath, e.FullPath); } 49) ***** The Amazing File Watcher App ***** Press 'q' to quit app. File: C:\MyFolder\New Text Document.txt Created! File: C:\MyFolder\New Text Document.txt renamed to C:\MyFolder\Hello.txt File: C:\MyFolder\Hello.txt Changed! File: C:\MyFolder\Hello.txt Changed! File: C:\MyFolder\Hello.txt Deleted'