C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 49 - Класс TFileStream. Понятие потока VCL / С++ Builder 5 / Borland C++

Шаг 49 - Класс TFileStream. Понятие потока VCL.

Вот мы и дошли до этого класса. Сначала я бы хотел бы дать некоторое вступление по поводу поточных классов VCL. Эти классы есть некоторое подобие альтернативы поточным классам C++. Как обычно в таких случаях с VCL, основной TStream класс никто впрямую не использует, от него можно только наследовать. Прямым потомком TStream является класс THandleStream, который некоторым образом интегрирован с оболочкой (я в смысле - Виндовсом). Дело в том, что в WinAPI есть такая категория функций, которые выдают (или используют в качестве параметра) дескрипторп потока. Как раз таким дескриптором и обладает класс THandleStream. Как обычно, все функции, предоставляемые API, довольно сложны в использовании, и загромождают программу ненужными ухищрениями. Поэтому и был создан этот самый класс.

Собственно от THandleStream произведен только класс TFileStream. Остальные из категории поточных произведены от TStream. Ну, мы рассматриваем TFileStream, так что этим и займемся.

Handle

Свойство, унаследованное от THandleStream. Определяет дескриптор потока. Этот дескриптор используется в вызовах функций WinApi. А, еще про WinAPI. Вот, мне писал один человек, как бы это получить активность с COM-порта. В принципе активность можно получить с любого порта, LPT, RS232 или еще чего. Правда последний - тот же COM в более современном исполнении. Есть такая функция WaitCommEvent. В данном случае Comm - не ошибка, а аббревиатура communication device.

Так вот, она через Handle порта позволяет ждать от него активности. Для нее наш дескриптор тоже подходит. Создавать файл нужно как одно из имен типа COM1, COM2, COM3, LPT1 и так далее. Для связи с VxD устройствами необходим путь типа "\\.\a". Последний открывает дескриптор для дисковода [a:]. Связь с портами - довольно обширная тема. Поэтому я рассмотрю ее позже.

Size

Содержит информацию о размере потока (в байтах). Можно установить это свойство для того, чтобы "обрезать" поток. Должен заметить, что не рекомендуется использовать это свойство с портами и именованными pipe. Pipe - механизм, обеспечивающий двунаправленный поток, туннель данных между процессами.

Position

Свойство, определяющее текущую позицию указателя потока. Более четко - количество считанных байтов от начала потока.

Теперь нужно и методы рассмотреть.

Конструктор TFileStream

Этот конструктор использует два параметра - имя создаваемого файла (AnsiString) и режим открытия. режим открытия задает типы операций и права доступа, применимые к данному объекту. Могут быть следующие значения, комбинируемые с помощью binary or оператора "|".

  • fmCreate
    создать новый файл. Если файл существует, то открывается в режиме чтения.
  • fmOpenRead
    открыть для чтения.
  • fmOpenWrite
    открыть для записи.
  • fmOpenReadWrite
    открыть и для того, и для другого.
  • fmShareCompat
    совмещенный режим доступа.
  • fmShareExclusive
    эксклюзивный режим. Ни одно приложение не может читать или записывать открытый файл.
  • fmShareDenyWrite
    запрет по записи для других приложений.
  • fmShareDenyRead
    запрет по чтению.
  • fmShareDenyNone
    никакого разделения ресурса.

Read, Write, Seek

Первые два в качестве параметра используют преременную void* и целое, определяющее длину считываемой/записываемой порции данных. Ну а Seek вообще очень похоже на fseek. Вот примеры использования функции:

TFileStream* stream=new TFileStream("c:\\test.txt",fmOpenReadWrite|fmShareExclusive)
//на всякий случай займем этот файл как эксклюзив ;)
stream->Seek(0,soFromBeginning);

В общем-то ничего другого и нет. Пример использования TFileStream будет дан в следующем шаге.


| |
Автор Аванесов Самвел.
[AD]