Streams


Object Pascal contains an object-oriented method to access stream data such as
disk
files
, memory files, and Blob fields.
All these type of streams share the same consepts like:
opening, reading, writing,
and
copying. Also you can copy data between different stream types.
One of the most important benefit of Streams (After being Object Oriented) is that
most of Delphi components that contains data, are supporting saving and loading
from streams such as Memo, ListBox, TStringList, etc.

File Stream:
You can use TFileStream to access disk files the same like untyped files do. That
means all the functionality which exist in untyped files can be reached in TFileStream
in addition to many other features.

---------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                            
Method
---------------------------------------------------------------------------------------------------------------------------------------------------------
Declaration                           var  F: TFileStream;
Assigning                             Assinging is combined with Opening
Opening for reading                
F:= TFileStream.Create('Youfile.dat', fmOpenRead);
Opening for writing                 F:= TFileStream.Create('Youfile.dat', fmOpenWrite);
Creating                                F:= TFileStream.Create('Youfile.dat', fmCreate);
Opening for read/write            F:= TFileStream.Create('Youfile.dat', fmOpenRead
+ fmOpenWrite);

Appending                            
F:= TFileStream.Create('Youfile.dat', fmOpenWrite);
                                          F.Position:= F.Size;
Open for sharing                   F:= TFileStream.Create('Youfile.dat', fmOpenRead,

in read                  fmShareDenyWrite);

Reading                               NumRead:= F.Read(Buf, SizeOf(Buf));
Writing                                F.Write(Buf, SizeOf(Buf));
Read string                          Setlength(S, 100); F.Read(Pointer(S)^, 100);
Write string                          F.Write(Pointer(S)^, Length(S));
Goto direct position              
F.Position:= 10; { Goto 11'th record }
Closing file and                    
F.Free;
Freeing object                  
Getting records count          
F.Size; { returns bytes count, also you can cut file
by specifing smaller size: F.Size:= F.Size - 5 }

Getting current position        F.Position;
Copy files                           SourceF.Position:= 0; F.CopyFrom(SourceF, 0);
---------------------------------------------------------------------------------------------------------------------------------------------------------

Example:

- Drop memory, button, and OpenDialog
- At Button's OnClick event write this code:

var
F: TFileStream;
begin
if OpenDialog1.Execute then
begin
  F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  Memo1.Lines.LoadFromStream(F);
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Size of file: ' + IntToStr(F.Size));
  F.Free;
end; // if OpenDialog1
end;

Example of coping:

procedure CopyF(SourceName, TargetName: string);
var
SourceF, TargetF: TFileStream;
begin
SourceF:= TFileStream.Create(SourceName, fmOpenRead);
TargetF:= TFileStream.Create(TargetName, fmCreate);
TargetF.CopyFrom(SourceF, 0);
SourceF.Free;
TargetF.Free;
end;


Memory Stream

Memory stream is semilar to File Stream in it's methods, but the main difference
is that Memory Stream data is exists only in memory. It can be used as intermediate
buffer in which you can process data in memory then you can save it back to disk.

Example:

var
M: TMemoryStream;
Data: string;
begin
M:= TMemoryStream.Create;
Memo1.Lines.SaveToStream(M);
SetLength(Data, M.Size);
M.Read(Pointer(Data)^, M.size);
// Here you can do any process to data
Data:= UpperCase(Data);
M.Position:= 0;
Memo1.Lines.LoadFromStream(M);
M.Free;
end;