Delphi 流的操作

來源:互聯網
上載者:User

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為資料的長度位元組數,該方法傳回值為實際寫入流中的位元組數。

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

函數原形為:

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

參數Offset為位移位元組數,參數Origint指出Offset的實際意義,其可能的取值如下:

soFromBeginning:Offset為移動後指標距離資料開始的位置。此時Offset必須大於或者等於零。

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

soFromEnd:Offset為移動後指標距離資料結束的位置。此時Offset必須小於或者等於零。該方法傳回值為移動後指標的位置。

4、Setsize:此方法實現改變資料的大小。函數原形為:

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時,CopyFrom從Source參數的當前位置拷貝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;

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.