Потоки TStream, TFileStream, TMemoryStream

Южно-Сахалинский институт экономики, права и информатики

Кафедра КТиС



















Пояснительная записка к курсовой работе



по дисциплине: Языки программирования и методы трансляции

на тему: Потоки: TStream, TFileStream, TMemoryStream



























Южно-Сахалинск

2010


Введение



Задачей курсовой работы является реализация программы для работы с файловой структурой операционной системы Windows. Для реализации программы требуется использовать интегрированную среду разработки Delphi7.

Цель работы – изучить принципы программирования файловой структуры в операционной системе Windows и создать программу для работы с потоками TStream, TFileStream и TMemoryStream. В проекте предполагается реализовать основные операции над потоками, такие как чтение, запись, удаление и редактирование. 

Разрабатываемая система выполняет следующие функции:

позволяет создавать потоки TFileStream, TMemoryStream,

сохранение данных в файлы,

открытие и редактирование файлов при помощи потоков,

использовать данные из файлов в программе.

Для разработки приложения используются следующие программные инструменты:

среда разработки Delphi 7


1. Поток TStream



В основе иерархии классов потоков лежит класс Tstream. Он обеспечивает выполнение основных операций потока безотносительно к реальному носителю информации. Основными из них являются чтение и запись данных. Класс Tstream порожден непосредственно от класса TObject. Потоки также играют важную роль в чтении/записи компонентов из файлов ресурсов (DFM). Большая группа методов обеспечивает взаимодействие компонента и потока, чтение свойств компонента из ресурса и запись значений свойств в ресурс.



Таблица 1 - Свойства и методы класса Tstream

Объявление

Описание

property Position: Longint;

Определяет текущую позицию в потоке

property Size: Longint;

Определяет размер потока в байтах

function CopyFrom( Source: TStream; Count: Longint) : Longint;

Копирует из потока Source Count байты, начиная с текущей позиции. Возвращает число скопированных байтов

function Read(var Buffer; Count: Longint) : Longint; virtual; abstract;

Абстрактный класс, перекрываемый в наследниках. Считывает из потока Count байты в буфер Buffer. Возвращает число скопированных байтов

procedure Read3uffer (var Buffer; Count: Longint) ;

Считывает из потока Count байты в буфер Buffer. Возвращает число скопированных байтов

function Seek (Off set: Longint; Origin: Word): Longint; virtual; abstract;

Абстрактный класс, перекрываемый в наследниках. Смещает текущую позицию в реальном носителе данных на Offset байтов в зависимости от условия Origin

function Write (const Buffer; Count: Longint): Longint; virtual; abstract;

Абстрактный класс, перекрываемый в наследниках. Записывает в поток Count байты из буфера Buffer. Возвращает число скопированных байтов

procedure WriteBuffer (const Buffer; Count: Longint);

Записывает в поток Count байты из буфера Buffer. Возвращает число скопированных байтов

function ReadComponent (Instance: TComponent): TComponent;

Передает данные из потока в компонент instance, заполняя его свойства значениями

function ReadComponentRes (Instance: TComponent) : TComponent;

Считывает заголовок ресурса компонента Instance и значения его свойств из потока.

procedure ReadResHeader;

Считывает заголовок ресурса компонента из потока

procedure WriteComponent (Instance: TComponent) ;

Передает в поток значения свойств компонента Instance

procedure WriteComponentRes (const ResName: string; Instance: TComponent) ;

Записывает в поток заголовок ресурса компонента Instance и значения его свойств



Итак, в основе операций считывания и записи данных в потоке лежат методы Read и Write. Именно они вызываются для реального выполнения операции внутри методов ReadBuffer и WriteBuffer, ReadComponent и WriteComponent. Так как класс TStream является абстрактным, то методы Read и write также являются абстрактными. В классах-наследниках они перекрываются, обеспечивая работу с конкретным физическим носителем данных. 

Листинг 1 - создание, чтение и запись потока



Var 

Stream: TStream; //Объявление потока

Begin

Stream := TMemoryStream.Create (...); //Создание потока

Stream.Read(...); //Чтение данных из потока 

Stream.Write(...); //Запись данных в поток

Stream.Free; //Очистить поток

End;



Группа методов обеспечивает чтение и запись из потока ресурса компонента. Они используются при создании компонента на основе данных о нем, сохраненных в формате файлов ресурсов. Для чтения ресурса используется метод ReadComponentRes, в котором последовательно вызываются: метод ReadResHeader — для считывания заголовка ресурса компонента из потока; метод ReadComponent — для считывания значений свойств компонента. Для записи ресурса в поток применяется метод writeComponentRes.


2. Поток TFileStream



Объект TFileStream является потомком главного объекта TStream и позволяет получить доступ к диску, а так же создать поток для работы с файлами. При этом поток работает с файлом без учета типа хранящихся в нем данных.

Полное имя файла, который надо открыть, задается в параметре FileName. Этот параметр — простая строка: 



constructor Create(const FileName: string; Mode: Word);



Параметр Mode определяет режим работы с файлом. Он составляется из флагов режима открытия: fmCreate — файл создается; fmOpenRead — файл открывается для чтения; fmopenwrite — файл открывается для записи; fmOpenReadWrite — файл открывается для чтения и записи.

И флагов режима совместного использования: 

fmShareExciusive — файл недоступен для открытия другими приложениями; 

fmShareDenyWrite — другие приложения могут читать данные из файла; 

fmShareDenyRead — другие приложения могут писать данные в файл; 

fmShareDenyNone — другие приложения могут производить с файлом любые операции. Создание потока аналогично примеру, рассмотренному в листинге 1.

Подробнее познакомимся с методами чтения, записи и внутренней структурой файла. Начнем со структуры. Когда вы открыли файл, позиция курсора устанавливается в самое начало и любая попытка чтения или записи будет происходить в эту позицию курсора. Если вам надо прочитать или записать в любую другую позицию, то надо передвинуть курсор. Для этого используется Метод Seek. "Точка отсчета" позиции зависит от значения параметра 

Origin: soFromBeginning — смещение должно быть положительным и отсчитывается от начата потока; 

soFromCurrent — смещение относительно текущей позиции в потоке; 

soFromEnd — смещение должно быть отрицательным и отсчитывается от конца потока. 

Не забывайте, что один байт - это один символ. Единственное исключение - файлы в формате Unicode. В них один символ занимает 2 байта.

Таким образом, надо учитывать, в каком виде хранится информация в файле.

Итак, если вам надо передвинуться на 10 символов от начала файла, можете написать следующий код:



Stream.Seek(10, SoFromBeginning) ;



Метод seek всегда возвращает смещение курсора от начала файла. Этим можно воспользоваться, чтобы узнать, где мы сейчас находимся, а можно и узнать общий размер файла. Если переместиться в конец файла, то функция вернет количество байт от начала до конца, т. е. полный размер файла.

В следующем примере устанавливается позиция в файле на 0 байт от конца, т. е. в самый конец. Тем самым получается полный размер файла:



Размер файла := Stream.Seek(0, soFromEnd);



Для чтения из файла нужно использовать метод Read. У этого метода два параметра:

Переменная, в которую будет записан результат чтения;

Количество байт, которые надо прочитать.

В листинге 2 рассмотрим пример чтения из файла с 20-й позиции

Листинг 2 – Чтения из файла, начиная с 20-й позиции.



Var Stream: TFileStream; //Переменная типа объект TFileStream. buf: array[0..10] of char; // Буфер для хранения прочитанных данных

begin // Далее открываем файл “Sample.wrk”. Stream:= TFileStream.Create('c:\Sample.wrk, fmOpenReadWrite); Stream.Seek(20, soFromBeginning); // Перемещение на 20 символов вперед. Stream.Read(buf, 5); // Чтение 5 символов из установленной позиции. Stream.Free; // Очистка потока.

end;



Метод Read возвращает количество реально прочитанных байт (символов).

Если не произошло никаких проблем, то это число должно быть равно количеству запрошенных для чтения байт. Есть только два случая, когда эти числа отличаются:

При чтении был достигнут конец файла и дальнейшее чтение стало невозможным;

Ошибка на диске или любая другая проблема.

Для чтения применяется метод write. У него два параметра :

Переменная, содержимое которой нужно записать;

Число байт для записи.

Пользоваться этим методом можно точно так же как и методом для чтения.



3. Поток TMemoryStream



Класс TMemoryStream обеспечивает сохранение данных в адресном пространстве. При этом методы доступа к этим данным остаются теми же, что и при работе с файловыми потоками. Это позволяет использовать адресное пространство для хранения промежуточных результатов работы приложения, а также при помощи стандартных методов осуществлять обмен данными между памятью и другими физическими носителями.

Для создания потока TMemoryStream используется конструктор Create без параметров:



Constructor Create;



Для чтения информации из файла с одновременным занесением ее в поток используется метод LoadFromFile:



Procedure LoadFromFile(const FileName: string);

файл поток класс метод

И аналогичный метод для записи содержимого потока в файл:



Procedure SaveToFile(const FileName: string);



метод для чтения информации из другого потока вне зависимости от его типа, а также метод записи хранимой информации в другой поток:



Procedure LoadFromStream(Stream: TStream);

Procedure SaveToStream(Stream: TStream);



Также, для потоков, работающих с оперативной памятью, определена

операция очистки содержимого с помощью метода Clear:

Procedure Clear; 


Заключение



Потоки, описанные выше играют большую роль при создании проектов для работы с файлами и информацией, а так же являются неотъемлемой частью при работе с файловой структурой. Разработанное приложение отражает основные функции потоков TFileStream и TmemoryStream, демонстрирует способы чтения/записи файлов с помощью данных потоков. Я считаю что в теоретической части курсовой тема потоков раскрыта полностью и предоставляет всю необходимую информацию для их использования. 


Список использованных источников



		М. Фленов Библия Delphi/ М.Е. Флеонов-СПб.: БХВ-Петербург, 2007. -880с.

		Http://proclub.ru –Клуб программистов.

		Http://life-prog.ru –Языки программирования.

		Http://Delphimaster.ru - Мастера DELPHI

		http://www.delphi.3dn.ru - Архив материалов - Всё о delphi

		http://www.delphiplus.org - Новости о языке программирования

		http:// www.delphiexpert.ru – Материал о Delphi

		http:// delphiworld.narod.ru - Материал о Delphi

		http:// www.delphirus.com - Материал о Delphi

		http:// www.delphibasics.ru - Справочник - "Основы Delphi"


Приложение



В ходе выполнения курсовой работы было создано программное приложение «Streams.exe».



Рисунок 1- Интерфейс программы Streams.exe