Доступ к буферу потока Как вы уже знаете, поток MemoryStream быть сформирован на базе предвари тельно массива байтов или путем последовательной записи в него данных методами W r i t e и W r i t e B y t e . При этом данные фактически храниться во внутреннем буфере потока. С помощью метода вы можете получить доступ к буферу потока. Этот метод возвращает ссылку на массив байтов, представляющий собой текущее содержи мое буфера. Метод позволяет преобразовать поток (даже закрытый методом C l o s e ) в массив байтов. Программа, исходный текст которой представлен в листинге 14.10, демонстрирует использование упомянутых выше методов. Листинг
14.10.
Файл
using System; using namespace GetBuffer class GetBufferApp static void
args)
MemoryStream i
new 0; i
10; i++)
buf (byte bt in buf)
ms byte[] foreach (byte bt in bufl)
500
А. В. Ф р о л о в . Г. В. Фролов. Язык С # . С а м о у ч и т е л ь
Получив управление, программа создаст поток в памяти и записывает в него лых чисел. После этого происходит сброс буфера:
це
new i
0; i
10; i++)
ms
Далее наша программа получает доступ к буферу открытого потока, вызывая метод buf
В результате в массив buf будет записано содержимое текущего буфера потока. Программа отображает его на консоли с помощью простого цикла: (byte bt in buf)
Заметим, что, хотя мы записали в поток всего байт, на консоль будут выведены только записанные числа, но и дополнительные нули. Это получается потому, что по умолчанию размер буфера превышает 10 байт. Метод GetBuf f e r возвращает нам полное содержимое буфера потока, изначально проинициализированного нулевы ми значениями. После вывода содержимого буфера потока на консоль наша программа закрывает поток: Несмотря на то что поток закрыт, хранящиеся в нем данные все еще могут быть доступны. С помощью метода программа может преобразовать закрытый поток в массив байтов, как это показано ниже: Далее содержимое полученного таким способом массива отображается на консоли: foreach (byte bt in bufl)
Обратите внимание, что во второй раз будет выведено только 10 чисел: 012345678900000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000 0123456789
Дело в том, что метод ТоАггау преобразует только тс данные, которые были за писаны в поток, а не весь буфер потока. Глава
Файлы и потоки
501
Потоки на базе строк string Рассказывая о потоках в оперативной памяти, следует упомянуть и потоки, создавае мые на базе текстовых строк класса Чтобы создать входной поток на базе строки string, вам потребуется класс Создав такой поток с помощью конструктора класса StringReader, программа сможет читать из него отдельные символы или блоки символов с помощью перегру женных методов Read.
Использование этих методов демонстрируется в программе, исходный текст кото рой представлен в листинге Листинг
14.11.
Файл
using System; using namespace class static void string str
args) "Каждый охотник желает знать, где сидит фазан";
StringReader sr
new
int ch;
ch if(ch
-1)
Console
sr
502
new b
ch)
new 15)
А. В. Фролов, Г. В. Фролов. Язык С # . С а м о у ч и т е л ь
В этой программе мы определили текстовую строку создали на ее основе поток sr класса
класса string, а затем
string str "Каждый охотник желает знать, где сидит фазан"; StringReader sr new
Далее мы в цикле считываем символы из потока и отображаем их на консоли: int
if(ch
-1)
Заметим, что метод Read возвращает значение int, а не char. Поэтому перед отображением прочитанного символа на консоли мы выполняем необходимое явное преобразование типов. Завершив работу с потоком, мы закрываем его обычным образом с помощью мето да Close:
Далее в программе демонстрируется чтение блока символов. Для этого мы снова открываем поток: sr
new
Используя перегруженный метод Read, мы читаем первые в массив data: char[] data
символов из потока
new 0,
Далее программа отображает на консоли содержимое массива и закрывает поток:
Вот что появится на консоли, после того как программа завершит свою работу: Каждый охотник желает знать, где сидит фазан Каждый охотник Глава 14. Ф а й л ы и потоки
503
Потоки класса StringBuilder С помощью класса вы можете создавать потоки на базе текстовых строк, которые затем поддаются изменению. Например, создав такой поток, програм ма может вставлять в произвольное место потока новые текстовые строки или добав лять их в конец потока, а также удалять и замещать фрагменты строк. Основные приемы работы с потоками класса StringBuilder демонстрируются в программе, исходный текст которой представлен в листинге Листинг
14.12.
Файл
using System; using using namespace class static void
args)
StringBuilder sb
new
"Каждый знать, где sw
new
data
Прежде всего наша программа создает поток StringBuilder с помощью конст руктора и записывает в него фрагмент фразы про охотника: StringBuilder sb
new
пользуясь методами Insert и Append, программа вставляет один фраг мент фразы в начало потока, а другой — в конец потока: "Каждый sb.Append(" знать, где
504
А В Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
При необходимости вы можете воспользоваться методами Remove и Replace со ответственно для удаления из потока фрагмента строки и для замены его другим фрагментом. Методу Remove в качестве первого параметра нужно передать начальный ин декс удаляемого фрагмента, а в качестве второго длину удаляемого фрагмента в байтах: public
index, int
Что же касается метода Replace, то определено его несколько перегруженных ва риантов. Следующие два метода заменяют в потоке соответственно все заданные символы и строки другими: public public Replace (string
char string
Эти методы делают замену во всем потоке. Следующие два метода позволяют ограничить область замены блоком, начало ко торого задано параметром index, а размер — параметром public Replace(char chl, char int index, int public strl, string str2, int index, int
Вернемся, однако, к описанию нашей программы. На следующем шаге программа создает поток StringWriter
на базе потока
new
Пользуясь этим потоком с помощью метода в конец фразы последнее слово:
наша программа дописывает
data
Далее содержимое потока выводится на консоль, после чего поток закрывается ме тодом Close:
В классе StringWriter определено множество перегруженных методов Write, позволяющих записывать в поток данные практически всех встроенных типов. Кроме того, предусмотрены аналогичные методы WriteLine, добавляющие после записи символ перевода строки. Глава 14. Файлы и потоки
505
Управление каталогами В библиотеке классов Microsoft Framework предусмотрено мощное средство ра боты с каталогами — класс С помощью статических методов этого клас са программа может выполнять такие действия, как получение списка логических дис ков, определение текущего каталога, просмотр содержимого каталогов, создание и удаление каталогов, проверка их существования и пр.
Список логических дисков Чтобы получить список всех логических дисков, имеющихся в системе, воспользуй тесь статическим методом drives s in drives)
Этот метод не имеет параметров. После выполнения он возвращает ссылку на мас сив текстовых строк вида \» с обозначениями всех доступных логических диско вых устройств.
Текущий каталог С помощью метода GetCurrentDirectory программа может опреде лить полный путь к текущему каталогу: string currentDir каталог:
Метод возвращает этот путь в виде текстовой строки класса При необходимости программа может определить диск, на котором находится те кущий или любой другой каталог. Для этого она должна воспользоваться методом GetDirectoryRoot, передав ему в качестве параметра путь к нужно му каталогу: string directoryRoot диска с текущим каталогом:
Просмотр содержимого каталога Для получения списка содержимого любого заданного каталога используйте метод drive_c_Dirs s in
506
А. В. Ф р о л о в . Г. В. Ф р о л о в . Язык С # . С а м о у ч и т е л ь
В качестве параметра этому методу нужно путь к интересующему вас ка талогу. Метод возвращает массив строк каждая из которых содержит имя ка талога или файла, расположенного в указанном каталоге. В программе, исходный текст которой приведен в листинге мы продемонст рировали использование метода а также других описанных ранее методов. Листинг
Файл
using System; using namespace class static void
args) логических дисков: drives s in drives)
string currentDir каталог: string диска с текущим каталогом: диска С: drive_c_Dirs s in
После запуска она получает и выводит на консоль список логических дисков, пол ный путь к текущему каталогу, обозначение корневого каталога диска, на котором на ходится текущий каталог, а также содержимое диска Ниже мы показали в виде информацию, отображаемую нашей программой на консоли: Глава 14. Файлы и потоки 507
Список логических дисков: А:\ D:\ Е:\ F:\ G:\ Н:\ I:\ J:\ К:\ L:\ Текущий каталог: С# Корень диска с текущим каталогом: Содержимое диска Files Documents
Создание каталога Чтобы создать каталог, используйте метод
CreateDirectory:
string dirName
В качестве параметра этому методу нужно передать полный путь к создаваемому каталогу. Учтите, что данный метод позволяет не только создать один каталог, но и построить цепочку вложенных каталогов. В приведенном выше примере создается каталог temp, а также вложенный в него каталог с именем dir.
Удаление каталога Чтобы удалить каталог, вам необходим метод
Delete. Существует два
перегруженных варианта этого метода. Первый из них имеет один параметр и позво ляет удалять только пустые каталоги. С помощью второго можно удалять непустые деревья каталогов вместе с подкаталогами и файлами. Ниже мы показали способ удаления дерева каталогов: удален",
В
второго параметра методу Directory
передастся флаг ре
курсивного удаления. Если он равен true, то метод рекурсивно удаляет все содержи мое каталога. В том случае, когда значение этого флага равно при попытке удаления непустого каталога возникает исключение IOException.
Получение информации о каталоге Методы класса Directory позволяют получать различную информацию о каталоге. Например, с помощью метода нетрудно опреде лить дату и время создания каталога: dt "Дата и время создания каталога:
508
В. Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
Информация о дате и времени возвращается в виде ссылки на объект класса Пользуясь свойствами этого объекта, извлечь отдельные ненты даты, такие, как число, месяц, час, минута и секунда создания файла. Аналогично с помощью методов
и
класса
Directory можно узнать, когда программы в последний раз обращались к каталогу и когда они выполняли в него запись. С помощью метода Directory
программа может получить подроб
ную информацию о родительском каталоге любого заданного каталога: каталог
Эта информация возвращается методом Directory
в виде ссылки
на объект класса Directorylnf о. Свойства этого класса позволяют получить такую ин формацию, как имя каталога и имя родительского каталога, атрибуты каталога, дата и время создания, а также изменения каталога, проверить существование каталога и т. д. В листинге 14.14 мы показали применение некоторых описанных выше методов для создания и удаления каталога, а также для получения справочной информации о созданном каталоге. Листинг
14.14.
Файл
using System; using namespace class static void
args)
string dirName создан", dt "Дата и время создания каталога: di каталог удален",
Глава 14. Файлы и потоки
509
Вот что эта программа выводит на консоль во время своей работы: Каталог создан Дата и время создания каталога: 7-8-2002 11:20:28 Родительский каталог Debug: Каталог удален
Таким образом, класс Directory предоставляет в распоряжение разработчика программ мощное средство управления каталогами. Что же касается управления фай лами, то такие средства тоже предусмотрены в рамках класса
Управление файлами В предыдущих разделах этой главы мы рассмотрели классы, для чтения и записи потоков, а также для работы с каталогами. При создании программ часто возникает необходимость выполнения и таких операций, как определение атри бутов файла, создание или удаление каталогов, удаление файлов, получение списка всех файлов в каталоге и т. д. В то время как практически все операции с каталогами можно выполнить при по мощи статических членов класса Directory, для выполнения операций с файлами используется класс File. Этот класс содержит только статические члены, поэтому вам не придется создавать объекты класса File.
Проверка существования файла или каталога С помощью метода вы можете проверить существование файла или каталога. Если файл существует, метод возвращает значение true, в противном случае зна чение Этот метод можно применять перед созданием потоков на базе файлов, если вам нужно избежать случайной перезаписи существующего файла. Вот пример использования метода string testFile уже
С такой конструкцией вы уже встречались в примерах программ, приведенных в этой главе. Если файл testFile существует, то программа возвращает управление оператором не предпринимая никаких других действий.
Создание файла В классе предусмотрены два метода, предназначенных для создания файлов. Первый из этих методов е именем CreateText создает текстовый файл и откры вает связанный с ним поток string testFile StreamWriter sw А. В. Фролов, Г. В. Фролов. Язык С # . С а м о у ч и т е л ь
Мы уже работали с такими потоками ранее в этой главе. Другой метод с именем Create создает файл и открывает для него поток класса Этот метод удобен для работы с двоичными файлами.
Удаление файла Удалить файл так же просто, как и создать. Для этого ваша программа должна исполь зовать метод Delete, как это показано ниже: string testFile
"temp.txt";
Определение времени создания файла Чтобы определить время создания файла, используйте метод как это показано ниже: string testFile dt
"temp.txt";
"Дата и время создания файла:
Дата и время создания файла возвращаются в виде ссылки на объект класса DateTime, о котором мы уже рассказывали ранее при описании класса Directory.
Определение времени доступа и изменения файла В классе File определены методы и Первый из них позволяет определить время и дату последнего доступа к файлу, а вто рой — время и дату последнего изменения файла. Оба метода возвращают ссылки класса DateTime.
Определение атрибутов файлов и каталогов С помощью класса нетрудно определить атрибуты файлов и каталогов, восполь зовавшись статическим методом В качестве параметра этому ме тоду необходимо передать путь к файлу или каталогу, атрибуты которых подлежат
FileAttributes fa
В качестве параметра методу нужно передать полный путь к файлу. После выпол нения метод возвращает перечисление класса FileAttributes. Возможные значе ния и их описание приведены в табл. 14.6. Глава 14. Файлы и потоки
Таблица
14.6.
Кодировки текстовых потоков Описание
Имя
Состояние архивирования. Используется для отметки файлов, выгруженных при создании копии Файл упакован Зарезервировано Указанный объект является каталогом Файл или каталог зашифрован Скрытый файл или каталог Файл имеет стандартный набор атрибутов Файл не индексируется сервисом индексирования ОС (та индексирование применяется для ускорения поиска) Файл находится в состоянии offline Только читаемый файл Файл содержит точку монтирования файла или каталога Файл, в котором большие зоны нулевых данных хранят ся в упакованном виде Системный файл Временный файл
Archive Compressed Device Encrypted Hidden
Readonly ReparsePoint SparseFile
Temporary
В листинге мы приведи исходный текст программы, демонстрирующей опи санные выше приемы работы с методами класса Листинг
14.15.
Файл
using System; using namespace class static void
args)
string testFile
"Файл
уже существует,
StreamWriter sw ("Каждый охотник желает знать, где сидит
512
А. В. Ф р о л о в , Г. В. Фролов. Язык С # . С а м о у ч и т е л ь
\"Пи\" равно примерно
3.1415926);
DateTime dt
"Дата и время создания Console. Write
файла:
FileAttributes fa
удален",
Эта программа создает файл, отображает его атрибуты на консоли, а затем удаляет файл: Дата и время создания файла: 7-8-2002 Атрибуты файла: Archive Файл удален
Изменение атрибутов файлов и каталогов С помощью методов SetAttributes,
и
программа может изменить
файлов и каталогов.
Переименование или перемещение файлов Для переименования или перемещения файла вы можете использовать метод Move, определенный в классе
Этот метод имеет два параметра, первый из которых содержит старое имя (или полный путь) файла, а второй — новое имя или новый полный путь.
Произвольный доступ к файлам В ряде случаев, например при создании системы управления базой данных, требуется обеспечить произвольный доступ к файлу. Рассмотренные нами ранее методы работы с потоками ввода и вывода пригодны лишь для последовательного доступа. Между тем в некоторых рассмотренных нами потоковых классах предусмотрен метод Seek, позволяющий программам выполнять позиционирование внутри файла. Глава
Ф а й л ы и потоки
Язык С # С а м о у ч и т е л ь
513
Проверка возможности позиционирования Заметим, что средства позиционирования (т. с. средства изменения текущей позиции) предусмотрены не во всех потоках. С помощью метода CanSeek программа может определить, есть ли такие средства в потоках того или иного класса. Например, поток класса FileStream, с помощью которого мы работали с двоич ными файлами, такими средствами обладает, а потоки класса TextReader и с помощью которых мы работали с текстовыми файлами, — нет. в классе FileStream определен метод Seek, с помощью которо го программа может выполнять позиционирование. Что же касается потоков BinaryReader и предназначенных для работы с двоичными потоками и позволяющих читать и писать переменные различных типов, то с ними ситуация, на наш взгляд, довольно странная. В классе BinaryWriter определен метод Seek, а в классе нет. Поэтому произ вольный доступ к двоичным файлам на чтение возможен только средствами класса FileStream. К сожалению, класс FileStream позволяет читать из потока только байты и массивы байтов, но не данные других типов.
Метод Seek Метод Seek позволяет установить текущую позицию внутри потока. Он имеет два па раметра, первый из которых (параметр позволяет задать относительную по зицию, а второй (параметр origin) — способ применения этой позиции: public override long
SeekOrigin
Относительная позиция offset задается в байтах. Что же касается параметра origin, то она с помощью перечисления SeekOrigin. Возможные значе ния для этого параметра представлены в табл. 14.7. Таблица
Способ позиционирования методом Seek Имя
Begin
Current End
Способ
позиционирования
Новая текущая позиция в потоке устанавливается рав ной значению, заданному параметром и считывается от начала потока То же, но новая позиция отсчитывается от текущей, ко торая была установлена до вызова метода Seek Новая текущая позиция отсчитывается от конца файла
В любой момент времени программа может определить текущую позицию внутри потока, обратившись для этого к свойству Заметим, что если поток может работать со средствами позиционирования, то, из меняя значение свойства Position, программа может изменять текущую позицию 514
А. В. Фролов, Г. В. Фролов. Язык С # . С а м о у ч и т е л ь
в потоке. Это возможно потому, что для таких потоков свойство Position доступно только для чтения, но и для записи. С помощью свойства Length вы определить текущую длину потока (т. е. файла, с которым связан поток).
Приложение DirectFileAccess Для иллюстрации способов прямого доступа к файлам мы подготовили приложение в котором создается небольшая база данных. Эта база данных состоит из двух файлов: файла данных и файла индекса. В файле данных хранятся записи, состоящие из двух полей — текстового и число вого. Текстовое поле с названием name хранит строки, а числовое поле с названием account — значения типа int. Дамп файла данных, создаваемого при первом запуске программы DirectFileAccess, приведен на рис. Н
Workshop -
Ready
Рис.
Дамп файла данных
Из этого дампа видно, что после первого запуска приложения в файле данных име ется несколько записей (табл. 14.8). Таблица 14.8. Записи в файле данных Номер
Смещение в файле данных
записи
Поле
0
Ivanov
1
11
Petrov
2
22
0
Поле
account
2000 3000
При последующих запусках программы каждый раз в файл данных будут добав ляться приведенные выше записи. Так как поле name имеет переменную длину, для обеспечения возможности прямо го доступа к записи по ее номеру необходимо где-то хранить смещения всех записей. Мы это делаем в файле индексов, дамп которого на момент после первого запуска приложения представлен на рис. Глава
Файлы и потоки
Рис.
Дамп файла индекса
Файл индексов хранит 8-байтовые смещения записей файла данных в формате long. Зная номер записи, можно легко вычислить смещение в файле индексов, по ко торому хранится смещение нужной записи в файле данных. Если извлечь это смеще ние, то можно выполнить позиционирование в файле данных с целью чтения нужной записи. Именно это и делает наша программа. После добавления трех записей в базу данных приложение извлекает 3 записи в обратном порядке, т. е. сначала запись с номером 2, затем с номером 1 и, наконец, с номером 0. Извлеченные записи отображаются в консольном окне: 3000, 2000, 1000, Ivanov
Исходные тексты программы Листинг 14.16. using System; using
приведены в листинге
Файл
namespace DirectFileAccess Класс Простейшая
данных
class SimpleDBMS Файл индексов string FileStream BinaryWriter BinaryReader Файл данных string FileStream fsData; EinaryWriter BinaryReader А. В. Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
Значение указателя на текущую запись long
Сохраняет имена файлов public
indexFile, String dataFile) indexFile; dataFile;
AddRecord Добавление записи в базу данных public void
name, int account)
try fsData
new
Устанавливаем текущую позицию в файле данных на конец файла Получаем смещение позиции в файле данных, в которой будет добавлена новая запись idxFilePointer Сохраняем это смещение в конце файла индексов new new
Сохраняем в файле дайнных два поля новой записи bwData
Глава 14. Файлы и потоки
new
517
ioe)
Извлечение записи
ее порядковому номеру
public string
nRec)
Строка, в которой будет сохранена извлеченная запись string sRecord
Значение поля account int Значение поля name string str null; Вычисляем смещение в файле индексов по порядковому номеру записи new new Пропускаем нужное количество байтов i 0; i nRec * i++) Извлекаем из файла индексов смещение записи в файле данных idxFilePointer
Выполняем позиционирование на нужную запись файле данных fsData new brData new Пропускаем нужное количество байтов i 0; i i++) te Извлекаем поля записи str account А В. Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С#. С а м о у ч и т е л ь
Объединяем значения полей в текстовую строку sRecord account, ioe)
Возвращаем извлеченную запись return sRecord;
class DirectFileAccessApp static void
args)
try Создаем новую базу данных SimpleDBMS db new Добавляем в нее 3 записи 1000) 2000) 3000) Получаем и отображаем содержимое первых трех записей с номерами 1 и 0
После ввода любой строки завершаем работу программы ioe)
Для работы с базой данных мы создали класс определив кон структор, методы для добавления записей и извлечения записей по их порядковому номеру. Глава
Файлы и потоки
Сразу после запуска метод Main программы создает базу данных, передавая конструктору имена файла индекса dbtest.idx и файла данных SimpleDBMS
new
После этого с помощью метода определенного в классе SimpleDBMS, в базу добавляются 3 записи, состоящие из текстового и числового полей: 1000); 2000);
Сразу после добавления записей приложение извлекает 3 записи с номерами 2, 1 и 0, вызывая для этого метод GetRecordByNumber, также определенный в классе SimpleDBMS:
записи отображаются на системной консоли.
Класс SimpleDBMS Рассмотрим теперь класс SimpleDBMS. В этом классе определены поля для работы с файлом индексов, с файлом данных, а также поле указателя на текущую запись: Файл индексов string FileStream fsldx; bwldx; BinaryReader Файл данных string FileStream fsData; BinaryWriter bwData; BinaryReader brData; Значение указателя на текущую запись long idxFilePointer 0;
Имена файлов индекса и данных хранятся соответственно в полях indexFile Name и dataFileName.
Поля
и
являются объектами класса
Они создаются
для файла индексов и файла данных. Непосредственное чтение файла индекса и данных выполняется средствами класса BinaryReader. Для хранения ссылок на потоки этого класса в классе SimpleDBMS предусмотрены поля brldx и brData.
Что же касается записи в файл индекса и даты, то она выполняется средствами класса BinaryWriter. Для хранения ссылок на соответствующие потоки в классе имеются поля bwldx и bwData.
520
А В. Ф р о л о в ,
Фролов. Язык
Самоучитель
Конструктор класса Конструктор класса выглядит достаточно просто. Все, что он делает, — это сохраняет имена файлов индекса и данных в соответствующих полях класса: public
indexFile, String dataFile)
indexFileName dataFileName
dataFile;
новой записи Метод AddRecord добавляет новую запись в конец файла данных, а смещение этой записи — в конец файла индекса. Поэтому перед началом записи текущая позиция обоих указанных потоков устанавливается на конец файла. Вначале метод AddRecord создает поток на базе файла данных: fsData
new
Далее текущая позиция потока устанавливается на конец файла данных, так как мы будем добавлять запись в конец файла: Для установки текущей позиции мы применили метод Seek из класса FileStream, передав ему в качестве первого параметра (задающего смещение) нуле вое значение, а в качестве второго параметра (задающего способ отсчета смещения) — значение End. В результате текущая позиция будет установлена на ко нец потока. Перед тем как добавлять новую запись в файл данных, метод AddRecord опреде ляет текущую позицию в файле данных (в данном случае это позиция конца файла): idxFilePointer
Данную позицию (смещение записи в файле данных) необходимо записать в файл индекса. Для этого наша программа открывает поток, связанный с файлом индекса: fsldx
new
Запись будет выполняться методом Write класса BinaryWriter, поэтому про грамма создает соответствующий поток: bwldx
new
Далее программа устанавливает текущую позицию потока на конец файла индек сов, записывает туда смещение записи в файле данных и закрывает оба потока, свя занных с файлом индексов:
Глава 14. Ф а й л ы и потоки
521
Теперь нужно сохранить новую запись в файле данных. Для этого наша программа поток данных, и устанавливает текущую позицию на конец файла: bwData
связанный с файлом
new
Далее программа последовательно сохраняет в этом потоке имя name и числовое значение a c c o u n t (т. е. содержимое полей добавляемой записи):
После выполнения этой операции потоки, связанные с файлом данных, закрываются:
Извлечение записи по ее Метод GetRecordByNumber позволяет извлечь произвольную запись из файла дан ных по ее порядковому номеру. Напомним, что смещения всех записей хранятся в файле индексов и имеют одина ковую длину 8 байт. Пользуясь этим, метод GetRecordByNumber вычисляет смеще ние в файле индекса простым умножением порядкового номера записи на длину пере менной типа long, т. е. на 8 байт, а затем выполняет позиционирование: fsldx brldx
new new
Пропускаем нужное количество байтов i 0; i nRec * 8; i++)
К сожалению, в классе BinaryReader метод Seek не предусмотрен. Поэтому для позиционирования на нужную запись нам пришлось прочесть в цикле необходи мое количество байтов «вхолостую». После этого метод GetRecordByNumber извлекает из файла индексов смещение нужной записи в файле данных, вызывая для этого метод idxFilePointer
Затем программа выполняет позиционирование на нужную запись в файле данных, пропуская необходимое количество байтов: fsData brData
new new
Open)
Пропускаем нужное количество байтов i 0; i i++)
522
В. Ф р о л о в , Г. В. Ф р о л о в . Я з ы к
Самоучитель
Поля записи читаются из файла данных в два Вначале читается строка тек стового поля, а затем — численное значение. Для этого вызываются соответственно методы
и
str account
Полученные значения полей объединяются в текстовой строке и записываются в переменную sRecord: sRecord
account,
Содержимое этой переменной метод GetRecordByNumber возвращает в качестве извлеченной строки записи базы данных: return sRecord;
Обработка исключений При работе с файлами и каталогами, а также при работе с потоками средствами клас сов, описанных в этой главе, могут возникать такие как FileNotFoundException, SecurityException, IOException и другие. В только что
рассмотренной программе (листинг мы использовали обработку исключений. Для того чтобы ваша программа, обращающаяся к файлам и потокам, вела себя пред сказуемым образом, мы советуем вам всегда предусматривать обработку исключений. Почему при работе с каталогами, файлами и потоками могут возникать исключения? Причины возникновения исключений могут быть самыми разными. Они могут быть связаны с ошибками разного рода, а также могут возникать при выполнении «штатных» операций, таких, например, как попытка чтения за концом потока. Например, если программа пытается создать каталог, но у пользователя, запустив шего эту программу, нет на это прав, возникает исключение SecurityException. Если же диск, на котором создается каталог, доступен только для чтения, появится ис ключение IOException. Исключение SecurityException возникает также при попытке открыть файл, для которого запрещен доступ. Например, если файл можно только читать, а он от крывается для записи, возникнет исключение SecurityException. Если файл не может быть открыт для записи по каким-либо другим причинам, возникает исключе ние IOException.
Исключение возникает при попытке открыть входной поток данных для несуществующего файла, т. е. когда файл не Что же касается метода ReadString, считывающего из двоич ного потока текстовые строки, то при достижении конца потока возникает исключение EndOf S
ion.
Более подробную информацию об исключениях, возникающих при работе с ката логами, файлами и потоками, вы найдете в справочной системе Microsoft Visual Studio или в библиотеке MSDN Глава 14. Файлы и потоки
523
Приложение 1. Зарезервированные ключевые слова С# abstract
do
in
protected
true
as
double else
int
public
try
internal
readonly ref
typeof uint
return sbyte sealed
unchecked
base break byte case catch
event explicit extern
is lock long namespace
short sizeof
ushort
checked
null
stackalloc
virtual
class const
obj ect operator
static
void
string struct
volatile
char
out
delegate
goto if
override
implicit
private
this
524
throw
Приложение 2. Имена и коды национальных культур Национальный язык,
страна
или район
не учитывается Аджарский Аджарский (Азербайджан, кириллица) Аджарский (Азербайджан, латиница) Албанский Албанский (Албания) Английский Английский (Австралия) Английский (Белиз) Английский (Зимбабве) Английский (Ирландия) Английский (Канада) Английский (Карибы) Английский (Новая Зеландия) Английский (Объединенное Королевство) Английский (Соединенные Штаты Америки) Английский (Тринидад и Тобаго) Английский (Филиппины) Английский (Южная Африка) Английский (Ямайка) Арабский Арабский (Альгерия) Арабский (Бахрейн) Арабский (Египет) Арабский (Иордания) Арабский (Ирак) Арабский (Йемен) Арабский (Катар) Арабский (Кувейт) Арабский (Ливан) 525
Имя
культуры
(пустая строка) az Cy-az-AZ Lt-az-AZ sq sq-AL en en-AU en-BZ en-ZW en-IE en-CA en-CB en-NZ en-GB en-US en-TT en-PH en-ZA en-JM
ar-JO
ar-QA ar-KW ar-LB
Код
культуры
0x007F 0x002C 0x082C 0x042C OxOOlC 0x04lC 0x0009 0x0C09 0x2809 0x3009 0x1809 0x1009 0x2409 0x1409 0x0809 0x0409 0x2C09 0x3409 0xlC09 0x2009 0x0001 0x1401 0x3C01 OxOCOl 0x2C01 0x0801 0x2401 0x4001 0x3401 0x3001
Национальный язык,
Арабский Арабский Арабский Арабский Арабский Арабский Арабский
страна
Армянский Армянский (Армения) Африканский Африканский (Южная Африка) Баскский Баскский Белорусский Белорусский (Беларусь) Болгарский Болгарский (Болгария) Венгерский Венгерский (Венгрия) Вьетнамский Вьетнамский (Вьетнам) Греческий Греческий (Греция) Грузинский Грузинский (Грузия) Датский Датский (Дания) Индонезийский Индонезийский (Индонезия) Исландский Исландский (Исландия) Испанский Испанский (Аргентина) Испанский (Боливия) Испанский (Венесуэла) Испанский 526
или район
(Ливия) (Марокко) (Объединенный Арабские Эмираты) (Оман) (Саудовская Аравия) (Сирия) (Тунис)
Имя
ar-LY аг-АЕ ar-SA ar-SY ar-TN hy hy-AM af af-ZA eu-ES be be-BY bg bg-BG hu hu-HU vi vi-VN el ka ka-GE da da-DK id id-ID is es es-AR es-BO es-VE
культуры
Код
культуры
0x1001 0x1801 0x3801 0x2001 0x0401 0x2801
0x002D 0x042D 0x0023 0x0423 0x0002 0x0402 OxOOOE 0x040E 0x002A 0x042A 0x0008 0x0408 0x0037 0x0437 0x0006 0x0406 0x0021 0x0421 OxOOOF 0x040F OxOOOA 0x400A
В. Ф р о л о в , Г В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
Национальный язык,
или район
Испанский (Гондурас) Испанский (Доминиканская Республика) Испанский Испанский (Колумбия) Испанский (Коста-Рика) Испанский (Мексика) Испанский (Никарагуа) Испанский (Панама) Испанский (Парагвай) Испанский (Перу) Испанский (Пуэрто-Рико) Испанский (Сальвадор) Испанский (Уругвай) Испанский (Чили) Испанский (Эквадор) Итальянский Итальянский (Италия) Итальянский (Швейцария) Казахский Казахский (Казахстан) Каталанский Каталанский Киргизский Киргизский (Казахстан) Китайский (Гонгконг) Китайский (Китай) Китайский (Маасу) Китайский (Сингапур) Китайский (Тайвань) Китайский (традиционный) Китайский (упрощенный) Корейский Корейский (Корея) Кункаи (Индия) Латвийский П р и л о ж е н и е 2. И м е н а и к о д ы н а ц и о н а л ь н ы х к у л ь т у р
Имя
культуры
Код
культуры
0x480A es-DO es-ES es-CO es-CR es-MX es-PA es-PY es-PE es-PR es-SV es-UY es-CL es-EC it it-CH
ca ca-ES ky ky-KZ zh-HK zh-CN zh-MO zh-SG zh-TW zh-CHT zh-CHS ko ko-KR kok
0xl40A 0x080A 0x4C0A ОхЗСОА 0x500A 0x440A
ОхЗООА 0x0010 0x0410 0x0810 0x003F 0x043F 0x0003 0x0403 0x0040 0x0440 0x0C04 0x0804 0x1404 0x1004 0x0404 0x7C04 0x0004 0x0012 0x0412 0x0057 0x0457 0x0026 527
Национальный язык,
страна
Латвийский (Латвия) Литовский Литовский (Литва) Македонский Македонский Малайский Малайский (Бруней) Малайский (Малайзия) Марати Марати (Индия) Монгольский Монгольский (Монголия) Немецкий Немецкий (Австрия) Немецкий (Германия) Немецкий (Лихтенштейн) Немецкий (Люксембург) Немецкий (Швейцария) Нидерландский Нидерландский (Бельгия) Нидерландский (Нидерланды) Норвежский Норвежский Норвежский Польский (Польша) Португальский Португальский (Бразилия) Португальский (Португалия) Румынский Румынский (Румыния) Русский Русский (Россия) Санскрит Санскрит (Индия) (Сербия, кириллица) 528
или район
Имя
культуры
mk-MK ms
de de-AT de-DE de-LU de-CH
nb-NO nn-NO
Pt pt-BR pt-PT ro ro-RO
sa Cy-sr-SP
Код
культуры
0x0426 0x0027 0x0427 0x002F 0x042F ОхООЗЕ 0x083E 0x043E 0x004E 0x044E 0x0050 0x0450 0x0007 0x0C07 0x0407 0x1407 0x1007 0x0807 0x0013 0x0813 0x0413 0x0014 0x0414 0x0814 0x0015 0x0415 0x0016 0x0416 0x0816 0x0018 0x0418 0x0019 0x0419 0x004F 0x044F OxOClA
В. Ф р о л о в . Г. В. Ф р о л о в . Я з ы к С# С а м о у ч и т е л ь
Национальный язык,
страна
или район
(Сербия, латиница) Сирийский Сирийский (Сирия) Словацкий Словацкий (Словакия) Словенский Словенский (Словения) Тайский Тайский (Таиланд) Тамил Тамил (Индия) Татарский Татарский (Россия) Турецкий Турецкий (Турция) Узбекский Узбекский (Узбекистан, кириллица) Узбекский (Узбекистан, латиница) Украинский Украинский (Украина) Урду Урду (Пакистан) Фарси Фарси (Иран)
Имя
th th-TH ta tt tt-RU tr tr-TR Cy-uz-UZ Lt-uz-UZ uk uk-UA ur ur-PK fa fi
Финский (Финляндия) Французский Французский (Бельгия) Французский (Канада) Французский (Люксембург) Французский (Монако) Французский (Франция) Французский (Швейцария) Хинди Хинди (Индия) Хорватский П р и л о ж е н и е 2 И м е н а и коды н а ц и о н а л ь н ы х 1 8 Язык С # С а м о у ч и т е л ь
культуры
Lt-sr-SP syr syr-SY sk sk-SK
fr fr-BE fr-CA fr-LU fr-MC fr-FR fr-CH hi hr
Код
культуры
0x081A 0x005A 0x045A OxOOlB 0x041B 0x0024 0x0424 OxOOlE 0x041E 0x0049 0x0449 0x0044 0x0444 OxOOlF 0x0043 0x0843 0x0443 0x0022 0x0422 0x0020 0x0420 0x0029 0x0429 OxOOOB 0x040B OxOOOC 0x080C OxOCOC 0xl40C 0xl80C 0x040C 0x0039 0x0439 OxOOlA 529
Национальный язык,
страна
или район
Хорватский (Хорватия) Чехословацкий Чехословацкий (Чехословацкая Республика) Шведский Шведский (Финляндия) Шведский (Швеция) Эстонский (Эстония) Японский Японский (Япония)
530
Имя
культуры
hr-HR CS
cs-CZ SV
sv-SE et et-EE ja ja-JP
А. В. Ф р о л о в , Г, В. Ф р о л о в . Язык
Код
культуры
0x041A 0x0005 0x0405 OxOOlD 0x08lD 0x041D 0x0025 0x0425 0x0011 0x0411
Самоучитель
Библиография Страуструп Б. Язык программирования С++. СПб.; во БИНОМ», 1999.
«Невский Диалект»: «Изд-
2.
Фролов А. В., Фролов Г. В. Создание Web-приложений: Практ. руководство. дом «Рус. Редакция»,
3.
Фролов А. В., Фролов Г. В. Практика применения PERL, PHP, Apache и MySQL для активных Web-сайтов. Издат.-торг. дом «Рус. Редакция», 2002.
4.
Петцольд Ч. Код.
5.
Шарова И. X. Зоология беспозвоночных.
6.
Некрасов Б. В. Учебник общей химии.
7.
Рывкин А. А. и др. Справочник по математике.
8.
Роджерсон Д. Основы
9.
Армстронг Т. ActiveX: создание Web-приложений. Киев: Издат. Гр.
Издат.-торг. дом «Рус. Редакция», Гуманит. изд. центр «ВЛАДОС»,
Химия, 1981. Высш.
1975.
Издат.-торг. дом «Рус. Редакция», 2000.
Фролов А. В., Фролов Г. В. Программирование для Windows NT. Ч. 1 МИФИ, (Биб-ка системного программиста; Т. 26).
Диалог-
Фридл Дж. Регулярные выражения. Библиотека программиста. СПб.: Питер, 12. Фролов А. В., Фролов Г. В. Программирование для Windows NT. Ч. 2 МИФИ, 1997. (Библ-ка системного программиста; Т. 27). Фролов А. В., Фролов Г. В. Всемирная паутина. Ваш спутник в Интернете. дат.-торг. дом «Рус. Редакция», 2000.
ДиалогИз
14. Фролов А. В., Фролов Г. В. Всемирная паутина. Электронная почта. торг. дом «Рус. Редакция», 2000.
Издат.-
15. Фролов А. В., Фролов Г. В. Всемирная паутина. Интернет-тусовка. торг. дом «Рус. Редакция», 2000.
Издат.-
16. Фролов А. В., Фролов Г. В. Базы данных в Интернете: практическое руководство по созданию Web-приложений с базами данных. Издат.-торг. дом «Рус. Редак ция», 2000. 17. Фролов А. В., Фролов Г. В. Сервер Web своими руками. (Библ-ка системного программиста; Т. 29).
531
Диалог-МИФИ, 1997.
18. Фролов А. В., Фролов Г. В. Сценарии JavaScript в активных страницах Web. Диалог-МИФИ, 1998. (Библ-ка системного программиста; Т. 34). Фролов А. В., Фролов Г. В. Грузите файлы на Web-сервер браузерами. системы, МИР ПК. № 3 — 4. 20. Фролов А. В., Фролов Г. В. Немного мы, МИР ПК. № 12. 1998. № 1999.
и страница ожила.
систе
21. Фролов А. В., Фролов Г. В. Активный сервер Web: расширения CGI. системы, МИР ПК. № 1997. 22. Дилип Н. Стандарты и протоколы Интернета. ция»,
Издат.-торг. дом «Рус. Редак
23. Пройдаков Э. Теплицкий Л. А. Англо-русский толковый словарь по вычисли тельной технике, Интернету и программированию. Издат.-торг. дом «Рус. Ре дакция», 2000.
532
А В. Ф р о л о в , Г.
Фролов. Язык С#. Самоучитель
Предметный указатель 195,269 ASP Common Type System
«умные» поля
318
207
A
binary
326 174,217,222 accessor 208 Active Server Pages 459 apartment threading apartments API 313 application domains Program Interface 14, 287, 314 Archive 512 407
514 523 424 BinaryWriter 23 Borland 22 Borland Delphi Borland Java Builder 10 Borland 312 Borland Turbo Pascal 22 boxing 194 - 467
С
225 227,411 248, 249 247 247 406,407
514 68
514 case 92 catch 89, 13
533
297, 307
124 484 class
92 486 default constructor
CLR 16 Code collection
Dequeue 124 512
481 406 Directory
508
Common Language Runtime Common Language Specification Compare 423 Component Object Model 512 computer 40 32,468 Console.Out 469 Console.ReadLine 469 Console.WriteLine 386 Contains
508 508 506 506 506 506 509
18 23
455 435 435
continue 88 multi-threading 452,455 410 472 472 critical sections 343 467 csc.exe 33 192 culture 385 Currentсортированный
double-byte character se 195 Dynamic Load Libraries E early binding 172 481 Encoding - 486 512 514 523 454 50 180
D data stream 534
52 464
event handler
359
В. Ф р о л о в , Г. В. Ф р о л о в . Я з ы к
Самоучитель
events driven program 358 events publishing 359 events subscribing 359 Exception 297 510 200 exception 288
444 GetLastAccess 509 GetLastAccessTime 509 183 GetUpperBound
F H FAR
33 510
512 337 HTML- 11,310 Hyper Text Markup Language
511 466 468 523 466 183
I IBM IBM
312 OS/2
IBM
313 18 423
fixed- 372 420 float-
if200 468
495
26 238
format string 387 free threading 319 11
445 - 445 361 473 inner exception 303
G
20 instance member
garbage collection 15 500 444 409, 433 180 Предметный
Intel Intel interface internal
38 250
535
466
469, 508, 523 MemoryStream 418 Microsoft 285 Microsoft
433 J 228 JavaScript ЛТ- 19 341 341 14
К 433
Framework SDK 26, 32 14 Microsoft FrontPage Microsoft Intermediate Language Explorer 13 Visual Basic Microsoft Visual Basic 10 Microsoft Visual J# 14 Microsoft Visual Studio 33 Microsoft Windows Scripting Host Microsoft Word 33 Monitor- 348 513 433 349 Library 33 MS-DOS MTA
L late binding 172 left value 60 Length- 245,515 load
lvalue
12 432 344,429 337 60
Macintosh Main 32 Managed С++, 14 managed code Managed Extensions 20 536
Framework
319
310 multi-threaded apartments
N namespace 30 Netscape Communication Corporation Netscape Navigator 467 new 473 459 73,457 512 Notepad
32 408
Novell NetWare 54,297 Фролов, Г
313
Язык
Самоучитель
push
о
450 450
484 512 472 OpenOrCreate 473 operator 200 459 Original Equipment Manufacturer
423
484
7 Rapid Application Development
7
475 475 475 475 475 475 475 475 475
380 380 parent Pascal
403 4,
465 450 455 Perl 16, 368 14 PHP Hypertext Preprocessor 450 450 514 mult-threading 386 priority 337 private process project 35 properties 205, 237 protected publicpeek
Предметный указатель
418,512 475 475 475 475 475 ReadUInt64 475 473 ref 156, 368 regular expression 368 RemoveAt
448 512
424 537
Sun Microsystems
s sandbox 159 SecurityException 523 466,513,514 468
Synchronized SyncRoot 297 297
513 446 SetLastAccessTime
433 513 513 513
245 Single Thread Apartments single-threaded single-threaded apartment 330 smart fields 207 solution 35 421 406,441,442 512 382 386
System.Console.Write 465 WriteLine 465 361 297 System.Exception.Message
385 293, 297 466 -
stack
449 406 Standard Template Library 342 318,319 static17
297 419 297 183 298
StreamWriter string 49
298 375 386 381
315
tion Substring 538
324,468 376
326 330 298
Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
unary 68 unchecked 296 UNICODE
17
368, 380,
512 unsafe 372 unsafe code 25 upcast 326
using
330 341 333 288
V
330 500 88 88 88 88 88 88 88 88 380 88 88 183 88 88 88 ToUpper- 380 379 379 379 Truncate
30, 486 486
value Value
433
13 verbatim 54 virtual Visual Perl 16 18 void W 310 while white space 346 Windows Forms 498 WriteLine 13
473
505
x UCS Transformation Format
Предметный указатель
486
17 459 73,457 539
А абстрактное свойство 221 абстрактный класс активные серверные страницы 13 319 аргументы запуска программы арифметико-логическое устройство ассемблер 5
38
виртуальные устройства ввода-выво 18 виртуальный диск виртуальный метод виртуальный процессор внутреннее исключение 303 восходящее приведение типов выделение тысяч 394 55 вытесняющая вытесняющая мультизадачность
Б базовый класс 122 базовый тип перечисления 57 39 10, 16 безопасное преобразование типов безопасный указатель белый пробел 379 динамической загрузки 9 библиотека динамической компонов ки 17 библиотека классов библиотека стандартных функций 6 библиотеки функций 17 библиотеки шаблонов бинарная операция 60 бинарный оператор 177 39 битовый массив 457 браузер буквальный литерал 54 буфер потока 500 буферизация В
виртуальная машина виртуальная машина Java виртуальная оперативная памягь виртуальная функция виртуальные ресурсы 540
Г гигабайт 40 глобальная переменная
141
д данные двухбайтовые символы 484 декремент 69 деление по модулю 67 деньги 49 дерево иерархии классов 151 дизайнер 12 динамическая инициализация масси 226 динамический документ HTML домен приложений домены приложений дословный литерал 54 дочерний класс драйвер 5 Е 481
Ф р о л о в , Г.
Фролов. Язык
Самоучитель
3 закрытый конструктор запись в стек 450 значение 55 значение в левой части
148 60
И И 73 извлечение из стека 450 изменение приоритетов потоков ИЛИ 73 имя переменной 99,225
337
Л литерал логическая переменная 50 логический литерал - 54 логический оператор 78 локальная переменная - 107
индексаторы 274 инициализатор 56 инициализатор конструктора инкремент 69 интерпретатор языка Basic - 9 интерфейс программирования ИСКЛЮЧАЮЩЕЕ 73 исключение итерационные операторы -
14
К каталог
506 40 43
классификатор доступа клиентский сценарий ключевые слова С# 41 код возврата кодирование символов 43 кодовые страницы коды машинных команд 19 38 комбинированный интерфейс 263 Предметный указатель
комментарии компилятор just-in-time 19 комплексное число компьютер 40 конкатенация 62 конкатенация строк 375 консольная программа 32 консольное окно 32 конструктор конструктор по умолчанию 147 контейнер критическая секция 343 культура
М макрокоманда 26 массив массивы массивов - 228 мастер проекта 36 матрица 227 машинная команда мегабайт 40 мейнфрейм 18 103 методы передачи параметров 155 многомерный массив многопоточная модель 310 множественное наследование 124 7 модель компонентных объектов 14, модель многопоточности модель разделенных потоков модель свободных потоков модификатор доступа 541
н набор данных 406 набор регистров 38 набор символов ШМ 485 наследование научный формат 392 73 небезопасный код 25 недопустимое значение индекса незначащий пробел 50 незначащий символ 379 неявное приведение типов нисходящее приведение типов О
обработка исключений обработчик события 359 108 объект Mutex 345 объектно-ориентированная обработка исключений 21 объектно-ориентированный подход 6 объявление индексатора 240 объявление интерфейсов однозадачная модель разделенных пото ков 35 одномерный массив 225 однопоточная модель 310 ожидание завершения работы задачи 108 операнд 55 оперативная память 40 оператор 55 оператор выбора оператор отношения 79 приведения типа оператор проверки 86 оператор структурного программирова ния 6 операторы безусловного перехода 82, операторы выбора 82 542
операция дополнения 76 оптимизирующий компилятор остаток от деления 84 отладка программ 59 очередь ошибка 284
6
П пакетный режим работы перегруженный конструктор перегрузка методов 144 перегрузка операторов передача параметров по ссылке 156 переключательная мультизадач312 41 переменная цикла 96 переопределение операций 62 перечисления 50 10 планировщик 336 подписка на подстрока - 376 позднее связывание 172 248 поле полиморфизм поразрядные операторы 73 поразрядный сдвиг поток поток в оперативной памяти 495 поток выполнения 464 поток данных 464 потоки на базе строк string 502 азование типов препроцессор гипертекста прерывания системного таймера 336 приведение типов приоритет 337 приоритет операторов 80 приоритеты задач 337 55 Фролов,
Язык
Самоучитель
значения параметров 285 проверка кода возврата 287 проверка содержимого верхушки сте 450 программирование в машинных кодах 38 программный интерфейс 287 программы, управляемые событиями 358 35 производный класс промежуточный язык пространство имен процедура доступа 208 процедурное программирование 6 399 314 процессор 5 публикация событий 359 пустой оператор Р
319 размерный тип данных 25 разряд 39 связывание 172 реализация интерфейса регулярное выражение 368 резидентная программа решение 35 родительский класс С
серверные сценарии 14 серверный сценарий символ новой строки 50 символы алфавита 42 символьный литерал UNICODE 53 синхронизация задач 340 синхронизированный массив 427
Предметный указатель
система быстрой разработки приложе ний 7 система исполнения программ Common Language Runtime 15 система сборки мусора системы виртуальных машин 18 слияние строк 62 словарь совместная многопоточность сортированный список 406 составной оператор список инициализации массива 226 ссылка на объект ссылочный тип данных 25 стандартная библиотека шаблонов стандартные классы исключений С# 297 стандартные потоки 464 стандартный поток ввода 468 стандартный поток вывода 468 стандартный поток вывода сообщений об ошибках - 468 статическая инициализация массива 226 статический конструктор статический метод статический член класса статическое поле класса статическое свойство 222 стек страница 484 страница оригинальных производителей оборудования OEM 484 строка формата 387 строковый литерал 53 структура 25 структура программы схемы адресации сценарий JavaScript Т
таблица приоритетов операторов С# 80 текущая позиция внутри файла 464 40 тернарный оператор 86 543
центральный процессор 38 цикл
У унарная операция унарный оператор универсальный формат 395 194 управляемый код управляющее устройство управляющие операторы 82 условный оператор 79, 82
Ч
член класса член экземпляра класса Ш шаблоны
Ф
файл 464 файл манифеста 20 фактор загрузки 432 фоновый процесс сборки мусора функция обратного вызова 350 X
397
представление чи сел 40 ширина поля вывода 389 Э элемент управления ActiveX
14
Я
ц целочисленный литерал
544
явное преобразование типов явное приведение типов язык ассемблера язык разметки гипертекста язык сценариев 12
Фролов,
Фролов. Язык С#. Самоучитель
Оглавление ВВЕДЕНИЕ
3
ОТ АССЕМБЛЕРА К С#
3
КЛАССИЧЕСКИЕ ЯЗЫКИ
5
Ассемблер С С++ Pascal Basic Java
5 6 6 7 8 10
Я З Ы К И ДЛЯ СОЗДАНИЯ ИНТЕРНЕТ-ПРИЛОЖЕНИЙ
HTML JavaScript JScript Script Perl PHP
11 13
14
Н О В Ы Е ТЕХНОЛОГИИ MICROSOFT
14
Платформа Microsoft Framework Совмещение разных языков программирования Интегрирование с ранее созданными проектами Библиотека классов Microsoft Framework Виртуальная машина CLR Домены приложений Компилятор JIT Сборки УПРОЩЕНИЕ ОТЛАДКИ ПРОГРАММ С #
20
ПРОГРАММИРОВАНИЕ Н А С # ДЛЯ MICROSOFT W I N D O W S ПРОЕКТ D O T G N U , ИЛИ С # ДЛЯ LINUX
23
Отличия С # о т С + +
23
Классы и наследование Интерфейсы
23 24
545
Типы данных Указатели Массивы Структуры Операторы и ключевые слова Директивы препроцессора ЧЕМ
24 25 25 25 25 26
ПРОГРАММЫ С #
26
УСЛОВНЫЕ ОБОЗНАЧЕНИЯ В КНИГЕ
27
БЛАГОДАРНОСТИ
28
К А К СВЯЗАТЬСЯ С АВТОРАМИ КНИГИ
28
ГЛАВА
БАЗОВЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ
ПЕРВАЯ ПРОГРАММА Н А ЯЗЫКЕ С #
29 29
Исходный текст простейшей программы Пространство имен System Определение собственного пространства имен Класс HelloApp Метод Main Трансляция программы при помощи Framework SDK Использование Microsoft Visual Studio Создание нового проекта Проекты и решения Изменение проекта
29 30 30 32 33 33 35 36
ЭЛЕМЕНТАРНЫЕ ТИПЫ ДАННЫХ
38
Бит Байт Числовые типы данных Текстовые символы и строки
39 39 40 42
ОБОЗНАЧЕНИЕ ТИПОВ ДАННЫХ В С #
45
Числа без знака Числа со знаком Числа с плавающей точкой Числа для финансистов Текстовые символы Текстовые строки Логический тип данных Перечисления
45 47 48 48 49 49 50 50 А.
Ф р о л о в , Г. В, Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
ЛИТЕРАЛЫ
Целочисленные литералы Литералы с плавающей точкой Символьные литералы Строковые литералы Логические литералы Литерал null ВЫРАЖЕНИЯ И ОПЕРАТОРЫ С #
Инициализация переменных и оператор присваивания Инициализация перечислений Проверка результата инициализации Значение в левой части Математические операторы Сложение Вычитание Умножение Деление Вычисление остатка при целочисленном делении Унарные операторы Унарный плюс Унарный минус Инкремент и декремент Унарное логическое Унарная поразрядная операция дополнения Преобразование типа выражения Пример использования унарных операторов Составные операторы Поразрядные операторы Поразрядное логическое И Поразрядное логическое ИЛИ. Поразрядное логическое ИСКЛЮЧАЮЩЕЕ ИЛИ. Унарная поразрядная операция дополнения Поразрядный сдвиг Пример использования поразрядных операторов Логические операторы Операторы отношения ПРИОРИТЕТЫ ОПЕРАТОРОВ
ГЛАВА 2. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ Простой условный оператор Оглавление
52 52 53 54 54 55
55 56 57 60 60 60 62 64 65 67 68 68 69 69 70 70 70 72 73 74 74 75 76 77 78 79 79
82 83 83 547
Вложенный условный оператор Оператор проверки Множественный выбор Применение логических операций
86 86 90
ОПЕРАТОР ВЫБОРА
Примеры применения оператора выбора Объединение меток case Пропущенный break
92 94 94
ИТЕРАЦИОННЫЕ ОПЕРАТОРЫ
95
Оператор for
95
цикла Возобновление цикла Оператор while Оператор do Оператор foreach Пример использования итерационных операторов
98 98 99
ОПЕРАТОРЫ БЕЗУСЛОВНОГО ПЕРЕХОДА
Операторы break и continue Оператор return Оператор goto Организация цикла с помощью goto Применение goto в операторе выбора switch Другие применения оператора goto
102 104
П У С Т О Й ОПЕРАТОР
106
СОСТАВНОЙ ОПЕРАТОР
107
ГЛАВА ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ П Е Р В Ы Е ШАГИ К О О П
108 108
Программная модель телевизора Данные Методы Объединяем все вместе Создание объектов класса Вызов методов класса Обращение к полям класса Пример программы
2
Ф р о л о в , Г.
Фролов. Язык С#. Самоучитель
Базовый класс Производный класс Множественное наследование Представление иерархии классов Пример программы МАСКИРОВАНИЕ МЕТОДОВ БАЗОВОГО КЛАССА
128
МОДИФИКАТОРЫ ДОСТУПА
129
Модификатор private Модификатор public Модификатор protected Модификатор internal Пример программы
133 134
СТАТИЧЕСКИЕ ЧЛЕНЫ КЛАССА
Статические поля класса Статические константы Статические методы класса
141
ПЕРЕГРУЗКА МЕТОДОВ
144
КОНСТРУКТОР
146
Конструктор по умолчанию Конструкторы и наследование Инициализатор конструктора base Инициализатор конструктора Статический конструктор
148
ДЕСТРУКТОР Е Щ Е О КЛАССАХ И ПОЛЯХ
Поля readonly Передача параметров по ссылке Запрет наследования классов
ГЛАВА 4. ПОЛИМОРФИЗМ ПРИМЕНЕНИЕ ПОЛИМОРФИЗМА
Применение классов Попытка обобщения с помощью наследования Виртуальные методы
161
РАННЕЕ И ПОЗДНЕЕ СВЯЗЫВАНИЕ Оглавление
549
АБСТРАКТНЫЕ КЛАССЫ
172
ПЕРЕГРУЗКА ОПЕРАТОРОВ
Краткая теория комплексных чисел Сравнение Сложение Вычитание Умножение Класс для представления комплексных чисел Перегрузка бинарных операторов Перегрузка унарных операторов Перегрузка операторов сравнения Пример программы КЛАСС SYSTEM.OBJECT
177
183
ГЛАВА 5. ПРЕОБРАЗОВАНИЕ ТИПОВ ОБЪЕКТОВ Н Е Я В Н О Е ПРЕОБРАЗОВАНИЕ ЧИСЛОВЫХ ТИПОВ
Числа без знака Числа со знаком Текстовые символы Числа с плавающей точкой Я В Н О Е ПРЕОБРАЗОВАНИЕ ЧИСЛОВЫХ ТИПОВ
190
ПРОВЕРКА ПРЕОБРАЗОВАНИЯ ЧИСЛОВЫХ ТИПОВ ПРЕОБРАЗОВАНИЯ ТИПОВ И КЛАССЫ
Псевдонимы типов данных Приведение производных и базовых классов Операторы is и as
195
НЕСТАНДАРТНОЕ ПРЕОБРАЗОВАНИЕ
ГЛАВА 6. СВОЙСТВА ОБЪЕКТОВ ОБЪЯВЛЕНИЕ СВОЙСТВА
207
Процедура доступа set Процедура доступа get Свойства только для чтения и только для записи П Р И М Е Р ПРОГРАММЫ
550
205 208 209 209 210
В Ф р о л о в . Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
НАСЛЕДОВАНИЕ СВОЙСТВ СТАТИЧЕСКИЕ СВОЙСТВА
ГЛАВА 7. МАССИВЫ И ИНДЕКСАТОРЫ
222
225 225
Одномерные массивы Многомерные массивы Массивы массивов Пример программы
225 227 228 229
И ЦИКЛЫ
Обработка одномерного массива чисел Обработка одномерного массива строк Использование оператора foreach Многомерный массив объектов класса String Несимметричный массив объектов класса String ИНДЕКСАТОРЫ
Объявление индексатора Индексаторы многомерных массивов ДОПОЛНИТЕЛЬНЫЕ ОПЕРАЦИИ С МАССИВАМИ В С#
Определение размера массива Сортировка и реверсирование массивов Поиск в массиве
ГЛАВА 8. ИНТЕРФЕЙСЫ ПРИМЕНЕНИЕ ИНТЕРФЕЙСОВ
Объявление интерфейса Реализация интерфейса Вызов методов интерфейса Пример программы
232 233 234 236 237
240 242 245
245 247 248
250 250
251 253 253
ПРОВЕРКА РЕАЛИЗАЦИИ ИНТЕРФЕЙСА
255
КОМБИНИРОВАННЫЕ ИНТЕРФЕЙСЫ
263
ИНТЕРФЕЙСЫ И НАСЛЕДОВАНИЕ КЛАССОВ
269
СВОЙСТВА В ИНТЕРФЕЙСАХ
274
ИНДЕКСАТОРЫ В ИНТЕРФЕЙСАХ
279
Оглавление
551
ГЛАВА 9. ОБРАБОТКА ИСКЛЮЧЕНИЙ
283
КЛАССИЧЕСКИЕ СПОСОБЫ ОБРАБОТКИ ОШИБОК
284
Предварительная проверка параметров Проверка кодов возврата функций и методов
285 285
ПРИМЕНЕНИЕ МЕХАНИЗМА ИСКЛЮЧЕНИЙ
288
Блоки Использование нескольких блоков catch Исключение при арифметическом переполнении СТАНДАРТНЫЕ КЛАССЫ ИСКЛЮЧЕНИЙ
288 290 294 297
СОЗДАНИЕ ИСКЛЮЧЕНИЙ
Создание исключений класса Exception Новый класс на базе класса Exception
298 300
КОНСТРУКТОРЫ КЛАССА EXCEPTION
303
ПЕРЕДАЧА ИСКЛЮЧЕНИЯ ДЛЯ ПОВТОРНОЙ ОБРАБОТКИ
304
ПРИМЕНЕНИЕ БЛОКА FINALLY
307
Виды МНОГОПОТОЧНОСТИ Переключательная многопоточность Совместная многопоточность Вытесняющая многопоточность
312 313
П Р О Ц Е С С Ы , ПОТОКИ И ПРИОРИТЕТЫ
314
Процесс Поток Домен приложения
315
П Р И М Е Р Ы МНОГОПОТОЧНЫХ ПРОГРАММ
315
Создание и запуск потока класса Thread Использование делегатов Модели многопоточности Завершение работы созданного потока Потоки и классы УПРАВЛЕНИЕ ПОТОКАМИ
323 326
Аварийное завершение потока 552
317
326 А.
Ф р о л о в . Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
Пауза в работе потока Приостановка и возобновление работы Управление приоритетами потоков СИНХРОНИЗАЦИЯ ПОТОКОВ
Ожидание завершения потока Критические секции Применение ключевого слова lock класса Использование класса Monitor
ДЕЛЕГАТЫ И СОБЫТИЯ
330 333 340
343 344 345 348
350
ИСПОЛЬЗОВАНИЕ ДЕЛЕГАТОВ
Статические делегаты Массивы делегатов
356
ОБРАБОТКА СОБЫТИЙ
Публикация событий Создание события Подписка на события Программа с обработкой событий
ГЛАВА 12. РАБОТА С ТЕКСТОВЫМИ СТРОКАМИ ПРИМЕНЕНИЕ КЛАССА SYSTEM.STRJ.NG
Создание строк Преобразование массива в строку Создание строки на базе фрагмента массива Заполнение строки символом Небезопасные конструкторы в классе Копирование и клонирование строк Конкатенация строк Извлечение подстроки Вставка подстроки Замена символов и строк Удаление символов из строки Удаление незначащих пробелов Преобразование к верхнему и нижнему регистру Выравнивание по левому и правому краю поля Объединение массива строк Разбор строки Сравнение строк Оглавление
359 361 363 364
368 369
369 370 370 371 373 375 376 377 377 378 379 380 380 382 383 553
ФОРМАТИРОВАНИЕ ТЕКСТОВЫХ СТРОК
Представление целых чисел Автоматическое форматирование Представление чисел в формате Определение ширины поля вывода Выравнивание числа внутри поля вывода Представление чисел с фиксированной десятичной точкой Формат по умолчанию Указание количества знаков после десятичной точки Ограничение ширины поля вывода Извлечение целой части числа Избыточная точность при выводе Представление чисел в научном формате Выделение тысяч при отображении больших чисел Универсальный формат для представления чисел Формат для представления денежных сумм ИСПОЛЬЗОВАНИЕ ШАБЛОНОВ ПРИ ФОРМАТИРОВАНИИ
Форматирование целых чисел Форматирование чисел с плавающей десятичной точкой Форматирование чисел с процентами Форматирование с учетом знака чисел
387 388 388 389 389 390 391 391 392 392 392 392 394 395 397
397 398 399 400
СОЗДАНИЕ НОВЫХ ФОРМАТОВ ПРЕОБРАЗОВАНИЕ ТЕКСТОВЫХ СТРОК В ЧИСЛА
403
ГЛАВА КОНТЕЙНЕРЫ ДЛЯ ХРАНЕНИЯ ОБЪЕКТОВ КОНТЕЙНЕРЫ В БИБЛИОТЕКЕ КЛАССОВ
FRAMEWORK
МАССИВ ARRAYLIST
406 407
Создание массива Добавление элементов в массив Чтение элементов массива Использование итераторов Использование индексов Изменение элементов массива Емкость и текущий размер массива Объединение массивов Удаление элементов из массива Запрет записи данных в массив 554
406
А, В. Ф р о л о в ,
407 408 409 409 409
417 В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
Ограничение размера массива Сортировка Обратное расположение элементов массива Поиск в массиве Работа в многопоточном режиме Применение метода Synchronized Свойство Свойство SyncRoot Недостатки массивов СЛОВАРЬ HASHTABLE
Создание словаря Конструктор без параметров Копирование словаря Указание начальной емкости словаря Другие конструкторы Добавление новых элементов Чтение содержимого словаря Поиск по ключу Предварительная проверка содержимого словаря Удаление элементов из словаря Емкость и текущий размер словаря Словари и многопоточность СОРТИРОВАННЫЙ СПИСОК
Создание и наполнение списка Извлечение данных из списка Определение индекса по ключу и значению Изменение значения по индексу Удаление элементов списка Работа в многопоточном режиме С Т Е К STACK
Создание стека Добавление элементов в стек Извлечение элементов из стека Проверка содержимого верхушки стека Просмотр стека с помощью итератора Удаление элементов стека Другие методы и свойства класса Stack Пример программы Оглавление
423 424 426 426 428 428 429 430
430 430 431 432 432 433 433 433 434 436 438 438 441
442 442 444 446 448 449 449
450 450 450
452 555
ОЧЕРЕДЬ Q U E U E
453
Создание очереди Добавление элемента в очередь Извлечение элементов из очереди Проверка содержимого начала очереди Просмотр очереди с помощью итератора Удаление элементов очереди Другие методы и свойства класса Queue Пример программы
Битовый
454 454 454 455 455 455 455 456
МАССИВ
ARRAY
457
Создание массива Инициализация ячеек массива Извлечение значений из массива Просмотр массива Логические операции над массивами
458 458 459 459 459
ГЛАВА 14. ФАЙЛЫ И ПОТОКИ
464
И
464
Стандартные потоки Базовые классы для работы с файлами и потоками Основные классы ввода и вывода Классы на базе Классы для работы с потоками Классы для работы с потоками текстовых символов Перечисления РАБОТА С О СТАНДАРТНЫМИ ПОТОКАМИ
468
Стандартный поток ввода Стандартный поток вывода Стандартный поток вывода сообщений об ошибках Программа
468 469 470 470
СОЗДАНИЕ ПОТОКОВ, СВЯЗАННЫХ С ФАЙЛАМИ
472
Открытие потока FileStream Открытие потоков BinaryWriter и Закрытие потоков двоичных данных Чтение двоичных данных Программа Binary с текстовыми файлами 556
464 465 465 466 466 467 468
472 474 474 474 475 476 479 А В. Ф р о л о в , Г
Фролов. Язык
Самоучитель
В Ы Б О Р КОДИРОВКИ СИМВОЛОВ
Кодовые страницы Недостатки модели кодовых страниц Стандарт UNICODE Unicode в Microsoft Windows UNICODE в Microsoft Windows 95 Кодировка текстовых потоков Кодировка текстовых строк в двоичных потоках
482 484 485 485 485 486 488
БУФЕРИЗАЦИЯ ПОТОКОВ
Буферизация двоичных потоков Буферизация текстовых потоков Принудительный сброс буферов
493 495
П о т о к и В ОПЕРАТИВНОЙ ПАМЯТИ
495
Создание потока Чтение данных Запись данных Доступ к буферу потока MemoryStream Потоки на базе строк string Потоки класса StringBuilder УПРАВЛЕНИЕ КАТАЛОГАМИ
Список логических дисков Текущий каталог Просмотр содержимого каталога Создание каталога Удаление каталога Получение информации о каталоге УПРАВЛЕНИЕ ФАЙЛАМИ
Проверка существования файла или каталога Создание файла Удаление файла Определение времени создания файла Определение времени доступа и изменения файла Определение атрибутов файлов и каталогов Изменение атрибутов файлов и каталогов Переименование или перемещение файлов ПРОИЗВОЛЬНЫЙ ДОСТУП К ФАЙЛАМ
Проверка возможности позиционирования Метод Seek Оглавление
495 496 498 500 502 504 506
506 506 506 508 508 508 510
510 510
511 513 513
514 557
Приложение DirectFileAccess Класс SimpleDBMS Конструктор класса SimpleDBMS Добавление новой записи Извлечение записи по ее номеру
520 521 521 522
ОБРАБОТКА ИСКЛЮЧЕНИЙ
523
ПРИЛОЖЕНИЕ ЗАРЕЗЕРВИРОВАННЫЕ КЛЮЧЕВЫЕ СЛОВА С#
524
ПРИЛОЖЕНИЕ 2. ИМЕНА И КОДЫ НАЦИОНАЛЬНЫХ КУЛЬТУР 525 БИБЛИОГРАФИЧЕСКИЯ
531
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
533
558
А
Ф р о л о в , Г. В. Ф р о л о в . Я з ы к С # . С а м о у ч и т е л ь
e-mail: dialog@bitex.ru http://www.bitex.ru/~dialog 320-43-77, 320-43-55 факс: 320-31-33
Предлагает литературу по программированию и вычислительной технике Авраамова О. Д. Язык VRML. Практическое руководство С. Я. Аналитические системы на базе Oracle С.
Голубев Д. В.,
OLAP
О. Б. ХРАНИЛИЩА ДАННЫХ
Баженова И. Ю. VISUAL С++ 6.0 Бартеиьев О. В. ФОРТРАН ДЛЯ ПРОФЕССИОНАЛОВ. Математическая библиотека IMSL. В 3-х частях О. В. 1С:ПРЕДПРИЯТИЕ: программирование для всех Березин Б. Березин С. Б. Начальный курс С и C++ Ватолии Д., Смирнов Юкин В. МЕТОДЫ СЖАТИЯ ДАННЫХ. Устройство архиваторов, сжатие изображений и видео. 2-е изд.
Вовк Е. Т. PAGEMAKER 6.5.
Гусева А. И. Учимся программировать: PASCAL 7.0. Задачи и методы их решения. 2-е изд., перераб. и доп. Гусева А. И. УЧИМСЯ ИНФОРМАТИКЕ. - 2-е изд., дополн. и испр. А. И. СЕТИ И МЕЖСЕТЕВЫЕ КОММУНИКАЦИИ. Windows 2000 Епанешников В. 4-е изд., испр. и дополн.
в среде TURBO PASCAL 7.0. -
Епанешников
В. DELPHI 4. Среда разработки: Учебное пособие
Епанешников
В. DELPHI. Проектирование СУБД
Лукин С. Н. ТУРБО-ПАСКАЛЬ 7.0. Самоучитель для 2-е изд., испр. и дополн. Лукин
Н. VISUAL BASIC. Самоучитель
-
начинающих
Маклаков С. В. МОДЕЛИРОВАНИЕ БИЗНЕС-ПРОЦЕССОВ С BPWIN 4.0 Низаметдинова Н. Н. СОВРЕМЕННАЯ РУССКАЯ ПУНКТУАЦИЯ Пильщиков В. Н. Программирование на языке АССЕМБЛЕРА В., Полищук A. AUTOCAD 2002
559
E-mail: d i a l o g @ b i t e x . r u . 3 2 0 - 4 3 - 7 7 , 320-43-55 Рудаков П.
К. Г. ЯЗЫК АССЕМБЛЕРА: уроки программирования
А. Л. ИНЖЕНЕРНАЯ КОМПЬЮТЕРНАЯ ГРАФИКА. AutoCAD Цисарь И.
Нейман В. Г. КОМПЬЮТЕРНОЕ МОДЕЛИРОВАНИЕ ЭКОНОМИКИ
А. В.,
А. В. КОМПЬЮТЕРНАЯ ГРАФИКА. Полигональные модели
Книги Потемкин В. Г. Инструментальные средства MATLAB 5.x Потемкин В. Г., Медведев В. С. Control System Toolbox. MATLAB 5 для студентов Лавров К. Т. П. Финансовая аналитика. MATLAB 6. (Под общ. ред. к. т. В. Г. Потемкина) Потемкин В. Г., Медведев В. С. Нейронные сети. MATLAB 6
Новые книги бизнес-приложений в экономике на базе MS Excel. Под ред. к. т. А. И. Афоничкина Елманова Н. Введение в OLAP-технологии Microsoft К. Г. WIN32. Основы программирования. Учебный курс