Delphi 流的操作

Delphi流的操作

 

一、流的概念

流簡單說是建立在面向對象基礎上的一種抽象的處理數據的工具,它定義了一些處理數據的基本操作,如讀取數據,寫入數據等,程序員只需掌握對流進行操作,而不用關心流的另一頭數據的真正流向。其實,流就是把整個對象轉化爲一個一個單字節數據,然後形成數據流,其形同把固體石塊打碎成一顆顆細小的沙子一樣,最後可以形成流沙。

二、流的主要功能

流的主要功能是對文件與非文件數據相互轉換進行操作(即它們之間的I/O操作)。如將圖片文件保存到數據庫,那麼數據庫中的圖片數據就變成非文件數據了,它只屬於某記錄某字段的數據。而諸如網絡上傳輸的數據、內存中的存儲的數據等也都屬於非文件數據,這些數據要轉變成文件也需要流操作。

三、Delphi中流的基本概念及函數聲明

㈠流的屬性

Delphi中,所有流對象的基類爲Tstream類,其中定義了所有流的共同屬性和方法。以下爲Tstream類中定義的屬性:

1.Size:此屬性以字節返回流中數據大小。

2.Position:此屬性控制流中存取指針的位置。

Tstream定義的虛方法:

1.      Read:此方法實現將數據從流中讀出。

函數原形爲:

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

參數Buffer爲數據讀出時放置的緩衝區,Count爲需要讀出的數據的字節數,該方法返回值爲實際讀出的字節數,它可以小於或等於Count中指定的值。

2.Write:此方法實現將數據寫入流中。

函數原形爲:

Function Write(var Buffer;Count:Longint):Longint;virtual;abstract;

參數Buffer爲將要寫入流中的數據的緩衝區,Count爲數據的長度字節數,該方法返回值爲實際寫入流中的字節數。

3Seek:此方法實現流中讀取指針的移動。

函數原形爲:

Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;

參數Offset爲偏移字節數,參數Origint指出Offset的實際意義,其可能的取值如下:

soFromBeginning:Offset爲移動後指針距離數據開始的位置。此時Offset必須大於或者等於零。

soFromCurrent:Offset爲移動後指針與當前指針的相對位置。

soFromEnd:Offset爲移動後指針距離數據結束的位置。此時Offset必須小於或者等於零。該方法返回值爲移動後指針的位置。

4Setsize:此方法實現改變數據的大小。函數原形爲:

Function Setsize(NewSize:Longint);virtual;

Tstream類定義的靜態方法:

1.      ReadBuffer:此方法的作用是從流中當前位置讀取數據。

函數原形爲:

Procedure ReadBuffer(var Buffer;Count:Longint);

參數的定義跟上面的Read相同。注意:當讀取的數據字節數與需要讀取的字節數不相同時,將產生EReadError異常。

2.      WriteBuffer:此方法的作用是在當前位置向流寫入數據。

函數原形爲:

Procedure WriteBuffer(var Buffer;Count:Longint);

參數的定義跟上面的Write相同。注意:當寫入的數據字節數與需要寫入的字節數不相同時,將產生EWriteError異常。

3.      CopyFrom:此方法的作用是從其它流中拷貝數據流。

函數原形爲:

Function CopyFrom(Source:Tstream;Count:Longint):Longint;

參數Source爲提供數據的流,Count爲拷貝的數據字節數。當Count大於0時,CopyFromSource參數的當前位置拷貝Count個字節的數據;當Count等於0時,CopyFrom設置Source參數的Position屬性爲0,然後拷貝Source的所有數據;

Tstream派生類

1.      TFileStream(文件流)

使用TFileStream類來存取文件,首先要建立一個實例。聲明如下:

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

Filename爲文件名(包括路徑),參數Mode爲打開文件的方式,它包括文件的打開模式和共享模式,其可能的取值和意義如下:

打開模式:

fmCreate :用指定的文件名建立文件,如果文件已經存在則打開它。

fmOpenRead :以只讀方式打開指定文件

fmOpenWrite :以只寫方式打開指定文件

fmOpenReadWrite:以寫寫方式打開指定文件

共享模式:

fmShareCompat :共享模式與FCBs兼容

fmShareExclusive:不允許別的程序以任何方式打開該文件

fmShareDenyWrite:不允許別的程序以寫方式打開該文件

fmShareDenyRead :不允許別的程序以讀方式打開該文件

fmShareDenyNone :別的程序可以以任何方式打開該文件

2.      TmemoryStream(內存流)

實際應用內存流使用也非常多,就是說在內存中建立一個流對象,它的基本方法和函數跟上面是一樣的。

Source:=TMemoryStream.Create;

3.TresourceStream(資源流)

資源流主要應用於對資源文件的操作。

㈤與流操作的一些相關函數和方法

1.sizeof(變量:Integer):獲得變量所佔空間的大小。

2.流類變量.SaveToFile(目標文件名):將流轉變爲文件保存。

3.其它類變量.SaveToStream(流類變量):將類變量內容轉變爲流。

4. 其它類變量.LoadFromFile(目標文件名):將文件加載到其它類變量。

5. 其它類變量.LoadFromStream(流類變量):將流類變量加載到其它類變量。

6. 流類變量.Free:釋放流。

四、Delphi流的常用操作方法

㈠將文件轉換爲文件流

var Source: TFileStream;

begin

Source:=TFileStream.Create(源文件,fmOpenRead or fmShareExclusive);

End;

以上代碼的意義是:將源文件以只讀或者禁止任何方式打開文件的方式打開,並創建成文件流的形式,最後將其賦值給文件流變量Source。

㈡將文件轉換爲內存流

var Source: TMemoryStream;

begin

Source:=TMemoryStream.Create;

Source.LoadFromFile(源文件);

End;

以上代碼的意義是:創建一個內存流變量Source,並將源文件加載到流變量Source中。

㈢將內存流保存成文件

var Target: TMemoryStream;

begin

Target.SaveToFile(‘目標文件’);

end;

注意,文件流一經創建就是以文件的形式保存在磁盤中,因此沒有像內存流一樣有轉換成文件的操作。

㈣將其它類變量轉變爲流變量

var BmS: TMemoryStream;

Bitmap1:TBitmap;

begin

Bitmap1.SaveToStream(BmS);

end;

㈤將兩個流合併

var

  Target, Source: TFileStream;

begin

Source:=TFileStream.Create(輔文件, fmOpenRead or fmShareExclusive);

Target:=TFileStream.Create(主文件, fmOpenWrite or fmShareExclusive);

Target.Seek(0, soFromEnd);//將指針移到主文件的末尾

Target.CopyFrom(Source, 0);//注意:兩個流合併使用CopyFrom方法。

Target.Free;

Source.Free;

end;

以上程序實際爲兩個文件合併的操作,即將輔文件添加到主文件的後面,最後變成一個文件。需要注意的是兩個流合併需要先將指針移到主文件末尾,然後再將輔文件添加進來。該方法可用於文件加密、木馬捆綁、病毒傳染等。

㈥將兩個流分離

var

  Source: TFileStream;

  Target: TMemoryStream;

  MyFileSize: integer;

Begin

MyFileSize:=輔文件長度;

  Target :=TMemoryStream.Create;

  Source:=TFileStream.Create(主文件, fmOpenRead  or

          fmShareDenyNone);

  Source.Seek(-MyFileSize, soFromEnd); //定位到資源位置 

//注意:這裏面-sizeof(MyFileSize)的原表達式是0-SizeOf(MyFileSize)。意思將指針移到離末尾MyFileSize個字節處,準備從該處起讀取數據。參數soFromEnd

是“離末尾”的意思,如果參數是soFromBeginning,那就是“離前面”的意思。

  Target.CopyFrom(Source, MyFileSize); //取出資源

  Target.SaveToFile(TargetFile); //存放到文件

  Target.Free;

  Source.Free;

end;

上述程序實現的功能實際是將兩個合併的文件分離開來。該方法還可用於文件的分割、文件加密等。學習時請注意其指針移動的方法

發佈了6 篇原創文章 · 獲贊 15 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章