標籤:
參考:http://www.cnblogs.com/railgunman/articles/1800318.html
程式設計當中,我們時常遇到需要處理檔案、目錄及磁碟機的情況,這裡將對如何處理不同類型的檔案進行講述
主要包括如何使用 TFileStream 類封裝檔案的輸入/輸出以及如何利用 32 位windows的主要特徵——記憶體對應檔。將會學到如何建立一個封裝記憶體對應檔功能的 TMemoryMappedFile類,並用它在文字檔中進行文字查詢。還提供了一些關於選擇磁碟機、在樹形目錄中查詢檔案以及擷取檔案版本資訊的方法。使你對檔案、目錄及磁碟機有深入的認識。
處理檔案的輸入/輸出
你將要對三種檔案進行處理:文字檔、類型檔案、二進位檔案
以下幾節是關於檔案輸入/輸出的講解。文字檔是指可被任意文字編輯器讀取的ASCII文本。類型檔案指包含有程式員定義的資料類型的檔案。二進位檔案包含其他所有的類型,它是對包含任意格式或無格式資料的檔案的統稱
文字檔的處理
本文講述使用內建於 Object Pascal執行階段程式庫中的過程和函數處理文字檔的方法。在對文字檔進行任何處理之前,首先要開啟此文字檔。聲明變數:通過此變數可以引用一個文字檔。
開啟一個檔案需要兩步:首先是 AssignFile(),它可以將檔案變數與一個檔案關聯起來。接著進行第二步:開啟檔案。有三種方法開啟檔案:使用 ReWrite()過程建立並開啟檔案,對於一個已經存在的檔案,此操作將使得檔案被覆蓋;使用Reset()過程唯讀地開啟一個檔案;使用Append()過程向已經存在的檔案追加文本。
注意Reset()將以可讀寫方式開啟類型檔案和無類型檔案。可以使用 CloseFile()來關閉一個已經開啟的檔案
檔案的開啟和關閉
| AssignFile |
把一個外部檔案名稱和一個檔案變數相關聯 |
| Reset |
開啟一個存在的檔案,文字檔(唯讀),其他檔案(讀寫) |
| ReWrite |
建立並開啟一個新檔案(或者覆蓋已有的檔案) |
| Append |
以追加方式開啟一個檔案(只適用於文字檔) |
| CloseFile |
關閉一個開啟的檔案 |
| FileOpen |
開啟一個特定的檔案並返迴文件控制代碼 |
| FileCreate |
建立一個給定檔案名稱的檔案,並返迴文件控制代碼 |
| FileClose |
關閉一個特定控制代碼的檔案 |
後面的三個檔案主要提供系統內部使用,在檔案複製的編程過程中也往往會用到。它們操作的對象時檔案控制代碼,而不是檔案變數
檔案定位
| Seek |
把檔案當前位置移至指定部分 |
| FilePos |
返迴文件當前的位置 |
| Eoln |
返回行結束標誌 |
| EOF |
返迴文件結束標誌 |
| FileSeek |
改變當前檔案指標的位置 |
還有一個問題,如何判斷檔案已開啟?要不要讀寫完成之後就關閉檔案,下次讀或寫時再開啟?
用 TFileStream
對於通過 Byte 數組進行檔案操作的,在 FTP中經常會使用到,我也是在Delphi調用Web Service進行檔案的上傳和下載時找到這兩個函數的,挺好用的,推薦給大家。(申明:非本人所寫)
<1>將Byte數組組建檔案
| 12345678910111213141516 |
procedure ByteArrayToFile(Const ByteArray : TByteDynArray; Const FileName : String);var Conut : Integer; F : File of Byte; pTemp : Pointer;begin AssignFile(F, FileName); ReWrite(F); try Count := Length(ByteArray); pTemp := @ByteArray[0]; BlockWrite(F, pTemp^, Count); finally CloseFile(F); end;end; |
<2>將檔案產生Byte數組
| 1234567891011121314151617181920212223242526 |
function FileToByteArray(const FileName : String) :TButeBtnArray;const BLOCK_SIZE = 1024;var BytesRead, BytesToWrite, Count :Integer; F :Filw of Byte; pTemp : Pointer;begin AssignFile(F, FileName); Reset(F); try Count := FileSize(F); SetLength(Result, Count); pTemp := @Result[0]; BytesRead := BLOCK_SIZE; while(BytesRead = BLOCK_SIZE) do begin BytesToWrite := Min(Count, BLOCK_SIZE); BlockRead(F, pTemp^, BytesToWrite, BytesRead); pTemp := Pointer(LongInt(pTemp)+BLOCK_SIZE); Count := Count-BytesRead; end; finally CloseFile(F); end;end; |
| 123456789101112131415 |
function Encrypt(mStr : String; mKey : String) :String;var I, J :Integer;begin J:=1; Result := ‘‘; for I:=1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I] xor Ord(mKey[j])); if J + 1 <= Length(mKey) then Inc(J) else J:=1; end; {自己加步驟}end; |
| 123456789101112131415 |
function Decrypt(mStr : String; mKey : String) :String;var I,J: Integer;begin J :=1; Result := ‘‘; {自己加步驟} for I :=1 to Length(mStr) do begin Result := Result + Char(Ord(mStr[I] xor Ord(mKey[J])); if J+1 <= Length(mKey) then; Inc(J) else J:=1; end;end; |
| 123456789101112 |
procedure TForm1.Button1Click(Sender : TObject);const cKey1 = ‘誰想試試怎麼破‘; cKey2 = ‘我可不願意這樣玩(1)我可不願意這樣玩(2)我可不願意這樣玩(3)‘; cKey3 = ‘Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);‘;var S :String; //加密後的字元begin S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3); ShowMessage(S); Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1);end; |
Delphi如何處理不同類型的檔案