KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

sw.Close();

Запись в поток делается с помощью любого из четырех перегружаемых методов StreamWriter.Write(). Простейший из них записывает строку и дополняет ее комбинацией возврат каретки — перевод строки:

string NextLine = "Groovy Line";

sw.Write(NextLine);

Можно также записать один символ:

char NextChar = 'а';

sw.Write(NextChar);

Массив символов также возможен:

char [] Char Array = new char[100];

// инициализация этого массива символов

sw.Write(CharArray);

Можно даже записать часть массива символов:

int nCharsToWrite = 50;

int StartAtLocation = 25;

char [] CharArray = new char[100];

// инициализируем эти символы

sw.Write(CharArray, StartAtLocation, nCharsToWrite);

Пример: ReadWriteText

Пример ReadWriteText выводит результат использования классов StreamReader и StreamWriter. Он похож на предыдущий пример ReadBinaryFile, но предполагает, что считываемый файл является текстовым файлом, и выводит его в этом виде. Он может сохранить файл (со всеми изменениями, которые будут сделаны в тексте в текстовом поле). Он будет сохранять любой файл в формате Unicode.

Снимок показывает использование ReadWriteText для вывода того же файла CivNegotiations, который использовался раньше. В этот раз, однако, мы сможем прочитать содержимое гораздо легче.

Не будем вдаваться в детали добавления методов обработки событий для диалога открытия файла, поскольку они по сути такие же, что и в примере BinaryFileReader. Как и для данного примера, открытие нового файла приводит к вызову метода DisplayFile(). Единственное реальное различие между этим примером и предыдущим состоит в реализации DisplayFile, а также в том факте, что теперь имеется возможность сохранить файл. Она представлена другим пунктом меню — save. Обработчик для этого пункта вызывает другой добавленный в код метод — SaveFile(). (Отметим, что этот файл всегда перезаписывает первоначальный файл, этот пример не имеет возможности записи в другой файл.)

Посмотрим сначала на SaveFile, так как это простейшая функция. Мы просто записываем каждую строку текстового поля по очереди в поток StreamWriter, полагаясь на метод StreamReader.WriteLine() для добавления комбинации возврата каретки-перевода строки в конце каждой строки:

void SaveFile() {

 StreamWriter sw = new StreamWriter(ChosenFile, false, Encoding.Unicode);

 foreach (string Line in textBoxContents.Lines) sw.WriteLine(Line);

 sw.Close();

}

ChosenFile является строковым полем основной формы, которое содержит имя прочитанного файла (как и в предыдущем примере). Отметим, что при открытии потока определяется кодирование Unicode. Если желательно записывать файлы в другом формате, необходимо изменить значение этого параметра. Второй параметр в этом конструкторе будет задан как true, если мы хотим добавлять к файлу, но в данном случае мы этого не делаем. Кодирование должно задаваться во время создания объекта записи потока. В дальнейшем оно доступно только для чтения как свойство Encoding.

Теперь проверим, как считываются файлы. Процесс чтения осложняется тем, что мы не знаем, пока не прочитаем файл, сколько строк он будет содержать (другими словами, сколько последовательностей (char)13 - (char)10 находится в файле). Решим эту проблему, считывая сначала файл в экземпляр класса StringCollection, который находится в пространстве имен System.Collections.Specialized. Этот класс создан для хранения множества строк, которые могут динамически увеличиваться. Он реализует два интересующих нас метода: Add(), добавляющий строку в коллекцию, и CopyTo(), который копирует коллекцию строк в обычный массив (экземпляр System.Array). Каждый элемент объекта StringCollection будет содержать одну строку файла.

Метод DisplayFile() вызывает другой метод ReadFileIntoStringCollection(), который реально считывает файл. После этого мы знаем, сколько имеется строк, поэтому можно скопировать StringCollection в обычный массив фиксированного размера и передать этот массив в текстовое поле. Так как при создании копии копируются только ссылки на строки, а не сами строки, процесс будет достаточно эффективным:

void DisplayFile() {

 StringCollection LinesCollection = ReadFileIntoStringCollection();

 string [] LinesArray = new string[LinesCollection.Count];

 LinesCollection.CopyTo(LinesArray, 0);

 this.textBoxContents.Lines = LinesArray;

}

Второй параметр StringCollection.CopyTo() указывает индекс в массиве назначения, где мы хотим начать размещение коллекции.

Теперь рассмотрим метод ReadFileIntoStringCollection(). Мы используем StreamReader для считывания каждой строки. Основной трудностью является необходимость подсчитывать считанные символы, чтобы не превысить емкость текстового поля:

ArrayList ReadFileIntoStringCollection() {

 const int MaxBytes = 65536;

 StreamReader sr = new StreamReader(ChosenFile);

 StringCollection Result = new StringCollection();

 int nBytesRead = 0;

 string NextLine;

 while ((NextLine = sr.ReadLine()) != null) {

  nBytesRead += NextLine.Length;

  if (nBytesRead > MaxBytes) break;

  Result.Add(NextLine);

 }

 sr.Close();

 return Result;

}

Код завершен.

Если выполнить ReadWriteText — считать файл CivNegotiations и затем сохранить его, то файл будет иметь формат Unicode. Это невозможно для любого из обычных оконных приложений: Notepad, Wordpad и даже наш собственный пример ReadWriteText будут по-прежнему считывать файл и выводить его правильно в Windows NT/2000/XP, хотя, так как Windows 9х не поддерживает Unicode, приложения типа Notepad не смогут понять файл Unicode на этих платформах (Если загрузить пример с web-сайта издательства Wrox Press, то можно попробовать это сделать.) Однако, если попробовать вывести файл снова с помощью предыдущего примера ReadBinaryFile, то разница будет заметна немедленно, как на следующем экране. Два начальных файла указывают, что файл имеет формат Unicode, и поэтому мы видим, что каждый символ представлен двумя байтами. Этот последний факт вполне очевиден, поскольку старший байт каждого символа в данном конкретном файле равен нулю, поэтому каждый второй байт в этом файле выводится теперь как x00:

Чтение и запись в реестр

Во всех версиях Windows, начиная с Windows 95, реестр был центральным репозиторием всех конфигурационных данных, связанных с настройкой Windows, предпочтениями пользователя и установленным программным обеспечением и устройствами. Почти все коммерческое программное обеспечение сегодня использует реестр для хранения информации о себе, и компоненты COM должны помещать информацию о себе в реестр, чтобы клиент смог их вызвать. Платформа .NET и сопровождающая ее концепция о нулевом влиянии установки слегка уменьшили значение реестра для приложений в том смысле, что сборки являются полностью самодостаточными, поэтому никакая информация об определенных сборках не должна помещаться в реестр для сборок общего использования.

Тот факт, что приложения могут теперь устанавливаться с помощью программы установки Windows также освобождает разработчика от некоторых прямых манипуляций с реестром, которые обычно были связаны с установкой приложений. Однако, несмотря на это, при распространении любого законченного приложения вполне вероятно, что это приложение будет использовать реестр для хранения информации о своей конфигурации. Если приложение появляется в диалоговом окне Add/Remove Programs в панели управления, то создается соответствующая запись в реестре.

Как и можно было ожидать от такой всеобъемлющей библиотеки, как библиотека .NET, она содержит классы, которые предоставляют доступ к реестру. Имеются два класса, связанных с реестром, и оба находятся в пространстве имен Microsoft.Win32. Это классы Registry и RegistryKey. Прежде чем рассматривать их, кратко разберем структуру самого реестра.

Реестр

Реестр имеет иерархическую структуру, очень похожую на файловую систему. Обычно просмотр или изменение содержимого реестра выполняется с помощью одной из двух утилит — regedit или regedt32. regedit стандартно поставляется со всеми версиями Windows, начиная с Windows 95. Утилита regedt32 поставляется с Windows NT и Windows 2000 — она менее дружественна пользователю, чем regedit, но разрешает доступ к данным безопасности, которые regedit не может видеть. Здесь будет использоваться regedit, которую можно запустить, вводя regedit в диалоговом окне Run… или командной строке.

При первом запуске regedit появится примерно следующее изображение:

Regedit имеет интерфейс пользователя в стиле представлений дерева/списка, аналогичный Проводнику Windows, который соответствует иерархической структуре самого реестра. Однако, как мы скоро увидим, существуют некоторые различия.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*