послед

Page 1

Доступ к буферу потока Как вы уже знаете, поток 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. Основы программирования. Учебный курс


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.