Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Название:ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2007
- Город:Москва • Санкт-Петербург • Киев
- ISBN:ISBN 5-8459-1124-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Эндрю Троелсен - ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание краткое содержание
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML. Книга содержит множество примеров программного кода, призванного помочь читателю в освоении предлагаемого материала. Программный код примеров можно загрузить с Web-сайта издательства.
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
static void Main(string[] args) {
// Открытие сеанса двоичной записи в файл.
FileInfo f = new FileInfo("BinFile.dat");
BinaryWriter bw = new BinaryWriter(f.OpenWrite());
// Печать информации о типе BaseStream.
// (в данном случае это System.IO.FileStream).
Console.WriteLine("Базовый поток: {0}", bv.BaseStream);
// Создание порции данных для сохранения в файле.
double aDouble = 1234.67;
int anInt = 34567;
char[] aCharArray = { ' A', 'В', 'С'};
// Запись данных.
bw.Write(aDouble);
bw.Write(anInt);
bw.Write(aCharArray);
bw.Close();
}
Обратите внимание на то, что объект FileStream, возвращенный из FileInfo.OpenWrite(), передается конструктору типа BinaryWriter. С помощью такого подхода очень просто выполнить "расслоение" потока перед записью данных. Следует осознавать, что конструктор BinaryWriter способен принять любой тип, производный от Stream (например, FileStream, MemoryStream или BufferedStream). Поэтому, если нужно записать двоичные данные, например, в память, просто укажите подходящий объект MemoryStream.
Для чтения данных из файла BinFile.dat тип BinaryReader предлагает множество опций. Ниже мы используем PeekChar(), чтобы выяснить, имеет ли поток еще данные, и в том случае, когда он их имеет, использовать ReadByte() для получения значения. Обратите внимание на то, что байты форматируются в шестнадцатиричном виде и между ними вставляются семь пробелов.
static void Main(string[] args) {
// Открытие сеанса двоичной записи в файл.
FileInfo f = new FileInfo("BinFile.dat");
…
// Чтение данных в виде "сырых" байтов.
BinaryReader br = new BinaryReader(f.OpenRead());
int temp = 0;
while (br.PeekChar() != -1) {
Console.Write("{0,7:x}", br.ReadByte());
if (++temp == 4) {
// Запись каждых 4 байтов в виде новой строки.
Console.WriteLine();
temp = 0;
}
Console.WriteLine();
}
}
Исходный код. Проект BinaryWriterReader размещен в подкаталоге, соответствующем главе 16.
Вывод этой программы показан на рис. 16.9.

Рис. 16.9. Чтение байтов из двоичного файла
Программный мониторинг файлов
Теперь, когда вы уже знаете возможности различных средств чтения и записи давайте, рассмотрим роль класса FileSystemWatcher. Этот тип может быть исключительно полезен тогда, когда требуется программный мониторинг файлов, имеющихся в данной системе. В частности, с помощью типа FileSystemWatcher можно контролировать любые из действий, указанных в перечне NotifyFilters (значения его членов очевидны, но в случае необходимости более точную информацию можно получить с помощью справочной системы).
publiс enum System.IO.NotifyFilters {
Attributes, СreationTime,
DirectoryName, FileName,
LastAccess, LastWrite,
Security, Size,
}
Первым делом для работы с типом FileSystemWatcher нужно установить свойство Path, с помощью которого можно указать имя (и место размещения) каталога, содержащего контролируемые файлы, и свойство Filter, с помощью которого определяются расширения контролируемых файлов.
После этого можно указать обработку событий Сhanged, Created и Deleted, которые работают в совокупности с делегатом FileSystemEventHandler. Этот делегат может вызывать любой метод, соответствующий следующему шаблону.
// Делегат FileSystemEventHandler должен указывать на методы,
// имеющие следующую сигнатуру.
voidMyNotifacationiHandler( objectsource, FileSystemEventArgse)
Точно так же событие Renamed можно обработать с помощью типа делегата RenamedEventHandler, способного вызывать методы, соответствующие следующему шаблону.
// Делегат RenamedEventHandler должен указывать на методы,
// имеющие следующую сигнатуру .
voidMyNotificationHandler (objectsource , RenamedEventArgse)
Для иллюстрации процесса мониторинга файлов предположим, что мы создали на диске C новый каталог с именем MyFolder, cодержащий различные файлы *.txt (назовите их так, как пожелаете). Следующее консольное приложение осуществляет мониторинг файлов *.txt а каталоге MyFоlder и выводит сообщения о событиях, соответствующих созданию, удалению, изменению или переименованию файлов.
static void Main(string[] args) {
Console.WriteLine("***** Чудесный монитор файлов *****\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(@"Нажмите 'q' для выхода из приложения.");
while(Console.Read() != 'q');
}
Следующие два обработчика событий просто выводят информацию о модификации текущего файла.
static void OnChanged(object source, FileSystemEventArgs e) {
// Уведомление об изменении, создании или удалении файла.
Console.WriteLine("Файл {0} {1}!", e.FullPath, e.ChangeType);
}
static void OnRenamed(object source, RenamedEventArgs e) {
// Уведомление о переименовании файла.
Console.WriteLine("Файл {0} переименован в\n{1}",
e.OldFullPath, e.FullPath);
}
Чтобы проверить работу этой программы, запустите приложение и откройте Проводник Windows. Попытайтесь переименовать, создать, удалить файлы *.txt в MyFolder или выполнить с ними какие-то другие действия, вы увидите, что консольное приложение реагирует на эти действия выводом различной информации о состоянии текстовых файлов (рис. 16.10).
Исходный код. Проект MyDirectoryWatcher размещен в подкаталоге, соответствующем главе 16.

Рис. 16.10. Наблюдение за текстовыми файлами
Асинхронный файловый ввод-вывод
В завершение нашего обзора пространства имен System.IO давайте выясним, как осуществляется асинхронное взаимодействие с типами FileStream. Один из вариантов поддержки асинхронного взаимодействия в .NET вы уже видели при рассмотрении многопоточных приложений (см. главу 14). Ввиду того, что ввод-вывод может занимать много времени, все типы, производные от System.IO.Stream, наследуют множество методов, разрешающих асинхронную обработку данных. Как и следует ожидать, эти методы работают в связке с типом IAsyncResult.
Читать дальшеИнтервал:
Закладка: