1. 程式人生 > >delphi文件操作(比較全)

delphi文件操作(比較全)

寫入 con sender 類型 close 文本 版本信息 讀取 關於

Delphi中默認有input和output兩個文件變量,使用可以不用定義,直接使用.
  但: input:只讀、output:只寫。用時註意以免引起異常.

文件是由文件名標識的一組數據的集合,文件通常存放在磁盤上。源程序、學生檔案記錄、圖形、音樂等均可以作為文件存儲在磁盤上。操作系統是以文件為單位對數據進行管理的,也就是說,如果想讀取外存介質上的數據,必須先按文件名找到所指定的文件,然後再從該文件中讀取數據。要向外存介質上存儲數據,也必須先建立一個文件(以文件名標識),才能向它輸出數據。
在程序運行時,常常需要將一些數據(運行的最終結果或中間數據)輸出到磁盤上,以後需要時再從磁盤中輸入到計算機內存。這就要用到磁盤文件。

1.文件類型
file是一個文件類型說明符,通過file可以定義文件變量,也可以定義一些新的類型。在Delphi中支持下面3種類型的文件:即文本文件、類型文件和無類型文件(也稱二進制文件)。下面依次介紹3種文件類型變量的定義及使用方法。
Delphi程序設計中,對任何一種文件的操作都可以歸納為:建立_打開_讀/寫_關閉。
2. 文本文件
  (**** 轉載敬請註明-本文出處:南山古桃(nsgtao)的百度空間:http://hi.baidu.com/nsgtao/ ****)
2.1 文本文件的概念

  在Delphi中定義了TextFile類型表示文本文件,由字符的ASCII碼組成,最小存取單位為字符。文本文件也稱為ASCII碼文件。利用常見的文字編輯器可以瀏覽支件內容。

  文本文件是以行為單位進行讀、寫操作的。由於每一行長度不一定相同,不能計算出給定行在文件中的確切位置,因而只能順序地讀寫。在一個打開的文本文件上同時進行讀、寫操作是不允許的。

2.2 文本文件變量的定義
定義文件變量的語法格式如下:
var <文件變量名>:TextFile;
例如,Var myTextFile : TextFile;就定義了一個文本文件變量myTextFile,下面就可以通過此變量引用一個文本文件。

2.3 文本文件的使用

(1)文件變量與文件關聯
在使用文件變量進行文件操作之前,需要將文件變量與要操作的文件關聯,即給文件變量名賦值。文件變量賦值可以使用過程AssignFile,過程的說明語法格式如下:

procedure AssignFile(Var F;FileName:string);
其中,F為文件變量名,定義為無類型參數是為了和所有文件類型兼容;FileName是文件名字符串,是包括路徑的文件全稱名。例如,AssignFile (F,‘e:\delphi\program\extl.txt’);就將文件變量F和指定的文件e:\delphi\program\extl.txt關聯起來。後面所有對變量f的操作都是對指定文件的操作。

(2)使用文件變量打開文件
使用不同的過程打開文件,有3種方式:
procedure Rewrite(var F~File[;recsize:word]);
這個過程創建並打開文件,可以對文件進行寫。這裏的F是一個已經和指定文件名關聯的文件變量。對於一個已存在的文件,此操作將覆蓋原文件;如果文件不存在,將建立一個新的空文件。若是類型文件(下一小節介紹),可用recsize指定大小。·
procedure Reset(var F:File[;RecSize:Word]);
使用Reset過程以讀的方式打開一個文件,此時只能從文件中讀取數據。f為文件變量,打開文件後,文件指針指向文件開頭。如果試圖用reset過程打開一個不存在的文件時,將有I/O錯誤產生。
procedure.Append(var F:’Fext);
使用Append過程向已存在的文件追加文本,這個過程僅用於文本文件。當用append過程打開文件時,文件指針指向文件的尾部,此後輸入的數據將添加在文件原有數據的後面。該過程打開的文件(即F關聯的文件)必須存在,否則也將出現I/O錯誤。
(3)讀/寫文件
①讀取文件內容。在以讀的方式打開文件後,可以使用read和readln語句來讀取文件內容,其聲明代碼格式分別為:
procedure read([var F:’Fext;]V1[,V2,…,Vn]);
procedure readln([var F:’text;]v1[,V2,···,Vn]);
其中,F為文件變量。v1、v2、…、vn等為需要輸入的變量,其類型可以為字符串、字符、整數和實數類型。read和readln的區別為後者在讀取數據後,將文件指針移至下一行,上次讀取的數據與回車符之間的數據被忽略。
當讀取字符串時,必須用readln過程,否則讀完一行數據後,再使用read讀取字符串將得到空串。當讀取整型和實型數據時,文件中的數據用空格分隔,且必須符合數據格式,否則將產生I/O錯誤。
在讀取文件時,還必須判斷文件指針是否已到文件尾部,此時可以用Eof函數進行判斷,其聲明代碼如下:
function Eof[(‘var F:’rext)]:Boolean;
當文件指針指到尾部時,該函數返回值為true。
②向文件寫入數據。以寫的方式打開文件後,即可向其中寫入數據,寫人數據使用write和writeln過程,其聲明代碼如下:
procedure writeln([var F:’rext;]p 1[,p2,…,pn]);
procedure write([var F:‘rext;]p 1[,p2,‘·‘,pn]);
與read相似,p 1、p2、…、pn等為需要輸出的變量,可以是字符串、字符、整數和實數類型。一writeln在寫入數據後還會附加上回車和換行符,而下次要寫入的數據將寫在新的一行。
寫人數據時系統自動將數據轉化為字符串形式,1)~ASCII碼的形式保存在文件中。

(4)使用文件變量關閉文件
無論是輸入或輸出,在對文件操作完成後,都應關閉文件。關閉文件使用CloseFile過程,其聲明代碼如下:
procedure CloseFile(var F);
關閉文件後,系統釋放打開文件時使用的資源。特別是寫文件時,在調用write和writeln過程時,數據先寫入內存緩沖區,只有在緩沖區滿或關閉文件時,才把數據真正寫入磁盤文件中,因此寫完數據後不關閉文件可能丟失數據。
例2.15 使用Rewrite()過程在程序運行的當前目錄下創建一個文本文件file.txt,並向文件中增加5行文本。

Var
textf:TextFile; //定義文件變量textf
S:String;
i:Integer;
begin
AssignFile(textf,‘file.txt‘); //將文件變量textf與當前目錄中的“file.txt"文件關聯
Rewrite(textf); //創建文件或打開已存在的文件進行覆蓋
for i:=1 to 5 do
begin
S := ‘This is Line#‘;
writeln(textf,s,i);
end;
CloseFile(textf); //關閉已打開的文件textf
end.
被創建的文件中包含5行文本,如第3行為:This is line#3。
若要向一個已存在的文件追加新文本,應將其中的rewrite改為append。以上程序是向文件中寫入字符串和整數。其實,Object Pascal對於所有的數據類型都可以這樣處理。下面的程序演示了從文本文件中讀取數據的方法。
寫入文件
Var
F : Textfile; //申明變量
Begin
AssignFile(F,‘c:\ek.txt‘); //讓變量F和C:\ek.txt關連
ReWrite(F); {Create a new file named ek.txt}
Writeln(F,‘你要寫入文本文件的內容‘); //寫入文件
Closefile(F); //釋放變量F
End;
讀取文件
Var
F : Textfile;
str:String;
Begin
AssignFile(F, ‘c:\ek.txt‘); {Assigns the Filename}
Reset(F); {Opens the file for reading}
Readln(F, str);
ShowMessage(‘1. line of textfile:‘ +str);
Closefile(F); {Closes file F}
End;

下面轉自http://blog.csdn.net/xwchen/archive/2007/07/26/1710410.aspx
var f:text;
...
AssignFile(f,‘c:\1.txt‘);
ReWrite(f);
Writeln(f,‘This is a test‘);
CloseFile(f);
...
其中Rewrite是新建文件,若換成Reset則為打開文件
Writeln為行寫入並換行,Write為寫入不換行,Readln為讀一行並換行,Read為讀但不換行


delphi 讀寫文件方法有很多種:
我送你一貼:
程序設計當中我們時常遇到需要處理文件、目錄及驅動器的情況,本章將對如何處理不同類型的文件進行講述。本章包括如何使用T F i l e S t r e a m 類封裝文件的輸入/輸出以及如何利用3 2 位Wi n d o w s 的主要特征—內存映射文件。你將學習到如何創建一個封裝了內存映射文件功能的T M e m o r y M a p p e d F i l e類,並用它在文本文件中進行文本查詢。本章還提供了一些關於選擇驅動器、在樹型目錄中查詢文件及獲取文件版本信息的方法。本章將使你對文件、目錄及驅動 器有深入的認識。
處理文件的輸入/輸出
你將要對三種文件進行處理:文本文件、類型文件和二進制文件。
以下幾節是關於文件輸入/輸出的講解。文本文件指可被任意文本編輯器讀取的A S C I I 文本。類型文件指包含由程序員定義的數據類型的文件。二進制文件包含了其他所有的類型,它是對包含任意格式或無格式數據的文件的統稱。

文本文件的處理
本節講述使用內建於Object Pascal 運行時庫中的過程和函數處理文本文件的方法。在對文本文件進行任何處理之前,首先要打開此文本文件。聲明變量:通過此變量可以來引用一個文本文件。
打 開一個文件需要兩步:首先是A s s i g n F i l e ( ) ,它可以將文件變量與一個文件關聯起來。例如:這時,你可以進行第二步:打開文件。有三種方式打開文件:使用R e w r i t e ( )過程創建並打開文件;對於一個已存在的文件,此操作將使文件被覆蓋;使用R e s e t ( )過程只讀地打開一個文件;使用Append() 過程向已存在的文件追加文本。
註意Reset()將以可讀寫方式打開類型文件和無類型文件。可以使用C l o s e F i l e ( )來關閉一個已打開的文件。下例是各種調用的函數。

文件的打開與關閉
AssignFile :把一個外部文件名和一個文件變量相關聯
Reset :打開一個存在的文件
Rewrite :創建並打開一個新文件(或覆蓋原有文件)
Append :以添加方式打開一個文件(只適用於文本文件)
CloseFile :關閉一個打開的文件
FileOpen :打開一個特定的文件並返回文件句柄
FileCreate :創建一個給定文件名的文件並返回文件句柄
FileClose :關閉一個特定句柄的文件
後邊三個文件主要供系統內部使用,在文件復制的編程中也往往會用到。它們操作的對象是文件句柄而不是文件變量。

文件定位
Seek:把文件當前位置移到指定部分
FilePos:返回文件的當前位置
Eoln:返回行結束標誌
EOF:返回文件結束標誌
FileSeek: 改變當前文件指針的位置

還有個問題,如何判斷文件已打開?要不要讀寫完之後就關閉文件,下次讀或者寫時再打開?

正常情況下是這樣


用TFileStream
對於通過Byte數組進行文件操作的,在FTP中經常會使用到,我也是在Delphi調用Web Service進行文件的上傳和下載時找到這兩個函數的,挺好用的,推薦給大家。(申明:非本人所寫)

1. 將Byte數組生成文件

procedure ByteArrayToFile(const ByteArray : TByteDynArray; const FileName : string );
var
Count: 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數組

function FiIeToByteArray(const FileName:string ):TByteDynArray;
const
BLOCK_SIZE=1024;
var
BytesRead,BytesToWrite,Count:integer;
F:File 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;


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;


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;

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;

http://blog.csdn.net/zisongjia/article/details/70173090

delphi文件操作(比較全)