檔案操作
by clin003 at 20070528 from:http://blog.csdn.net/clin003
1.4 Delphi的檔案管理標準流程
根據功能我們把標準流程劃分為十一類進行介紹。
1.4.1 檔案的開啟與關閉
AssignFile : 把一個外部檔案名稱和一個檔案變數相關聯
Reset :開啟一個存在的檔案
Rewrite :建立並開啟一個新檔案(或覆蓋原有檔案)
Append : 以添加方式開啟一個檔案(只適用於文字檔)
CloseFile : 關閉一個開啟的檔案
FileOpen :開啟一個特定的檔案並返迴文件控制代碼
FileCreate :建立一個給定檔案名稱的檔案並返迴文件控制代碼
FileClose : 關閉一個特定控制代碼的檔案
後邊三個檔案主要供系統內部使用,在檔案複製的編程中也往往會用到。它們操作的對象是檔案控制代碼而不是檔案變數。
1.4.2 檔案定位
Seek : 把檔案當前位置移到指定部分
FilePos : 返迴文件的當前位置
Eoln : 返回行結束標誌
EOF : 返迴文件結束標誌
FileSeek : 改變當前檔案指標的位置
Seek與FileSeek的區別是:1. Seek僅用於記錄檔案;2. FileSeek的參數是檔案控制代碼、位移量、起始位置。其中起始位置有檔案首、當前位置、檔案尾三種選擇。Seek的參數是檔案變數、位移量,位移量是從檔案首開始定位的。3. FileSeek的位移量以位元組數來計算,而Seek是根據記錄號進行移動。
Seek、FilePos僅用於記錄檔案。但任何檔案都可以看作是基於位元組的記錄檔案。下面一段程式表示了它們的用法。
{ 該例子的設計介面為一個包含TOpenDialog組件的表單。}
uses Dialogs;
var
f: file of Byte;
size: Longint;
S: String;
y: Integer;
begin
if OpenDialog1.Execute then
begin
AssignFile(f, OpenDialog1.FileName);
Reset(f);
size := FileSize(f);
S := 'File size in bytes: ' + IntToStr(size);
y := 10;
// form1.Canvas.TextOut(); 設定在框體的某一地區輸出字元資訊。
Canvas.TextOut(5, y, S);
y := y + Canvas.TextHeight(S) + 5;
S := 'Seeking halfway into file...';
Canvas.TextOut(5, y, S);
y := y + Canvas.TextHeight(S) + 5;
Seek(f,size div 2); //Seek : 把檔案當前位置移到指定部分
S := 'Position is now ' + IntToStr(FilePos(f));
//filepos ;FilePos : 返迴文件的當前位置
Canvas.TextOut(5, y, S);
CloseFile(f);
end;
end;
{//下面是要設定表單地區為我們想要說的話
HRGN hRgn;
BeginPath(Canvas->Handle);
SetBkMode(Canvas->Handle,TRANSPARENT);
Canvas->Font->Name = "楷體_GB2312";
Canvas->Font->Size = 66;
Canvas->TextOut(1,1, "貴州師範大學電腦愛好者協會");
EndPath(Canvas->Handle);
hRgn = PathToRegion(Canvas->Handle);
SetWindowRgn(Handle,hRgn,true);
DeleteObject(hRgn);}
-------------------------------------------------------------
1.4.3 檔案刪除與截斷
Erase : 刪除一個存在的檔案
DeleteFile : 刪除一個檔案
Truncate : 從檔案當前位置將檔案截斷
Erase與DeleteFile的區別是:Erase以檔案變數為參數,當檔案不能刪除時引起一個異常;DeleteFile以檔案名稱為參數,當檔案不存在或不能刪除時返回False,而並不引起一個異常。
1.4.4 檔案名稱操作
Rename :檔案更名,以檔案變數為操作對象
RenameFile :檔案更名,參數為檔案的原名和新名
ChangeFileExt :改變副檔名
ExpandFileName :返迴文件全路徑名
ExtractFileExt :返迴文件副檔名
ExtractFileName :從全路徑名中返迴文件名
ExtractFilePath :返回特定檔案的路徑
1.4.5 檔案屬性
FileGetAttr :返迴文件屬性
FileSetAttr :設定檔案屬性
1.4.6 檔案狀態
FileSize :返迴文件對象大小
IOResult :返回上一次I/O操作的狀態
FileExists :檢測檔案是否存在
1.4.7 檔案日期
DateTimeToFileDate :把Delphi日期格式轉換為DOS日期格式
FileDateToDateTime :把DOS日期格式轉換為Delphi日期格式
FileGetDate :返迴文件的DOS日期時間戳記
FileSetDate :設定檔案的DOS日期時間戳記
1.4.8 檔案讀寫
Read,Readln :從文本或記錄檔案中讀取變數
Write :將指定變數寫入文本或記錄檔案
Writeln :將指定變數寫入文字檔並寫入一個行結束標誌
FileRead :從一個指定檔案中讀取變數
FileWrite :向指定檔案寫入資料
FileRead和FileWrite都是以檔案控制代碼為操作對象,主要供系統內部使用。
1.4.9 目錄操作
MkDir :建立目前的目錄的子目錄
ChDir :改變目前的目錄
GetDir :返回特定磁碟的目前的目錄
RmDir :刪除一個空子目錄
1.4.10 磁碟操作
DiskFree :返回磁碟自由空間
DiskSize :返回特定磁碟的大小
1.4.11 檔案尋找
FileSearch :尋找目錄中是否存在某一特定檔案
FindFirst :在目錄中尋找與給定檔案名稱(可以包含匹配符)及屬性集相匹配 的第一個檔案
FindNext :返回合格下一個檔案
FindClose :中止一個FindFirst / FindNext序列
有關檔案管理標準流程/函數的更詳細資料,請查閱Delphi相關的Help主題。以上的大部分過程在後面都有應用執行個體,讀者可以從中體會其用法。
by clin003 at 20070528 from:http://blog.csdn.net/clin003
在Delphi的線上說明Help系統中把有關檔案的過程/函數分為兩個主題:I/O Routine和File_Management Routine。前者大部分以檔案變數為操作對象,而後者大部分以檔案名稱或檔案控制代碼為操作對象。這裡為了方便讀者的使用,我們按功能重新進行了分類。在下一節中主要應用I/O Routine主題下的過程,而在第四節的綜合舉例中主要應用File_Management Routine主題下的過程。
另外,Windows提供了許多有關檔案管理的API函數。雖然在一般情況下,利用Delphi提供的函數已足夠解決問題,但有時候仍然需要使用Windows API。在(6.4.4.2)中我們就用到了Windows API函數GetDriveType。有關Windows API函數的情況,請讀者參閱相關的資料,這裡不再進行介紹。
-------------------------------------------------------------
//////////////顯示目前的目錄代碼///////////////////
通過建立一個返回字串的函數GetcurrentDirectory(),來獲得目前使用者使用的目錄。
該函數的名稱與Api函數GetCurrentDirectory()的名稱相同,但是定義參數及傳回值不同。Api函數的具體定義如下:
Dword GetCurrentDirectory(
Dword nBufferLength,//以字元表示的目錄緩衝的大小
LPTSTR lpBuffer //目前的目錄的緩衝地址
}
實現步驟:
建立一個應用程式。
在應用程式中法制一個編輯框Edit1和一個button1.
開啟單元檔案unit1,在單元檔案中定義返回字串值的函數GetcurrentDirectory。
為該函數輸入合適的代碼,並正確使用api函數getcurrentDirectory及getMem()及freeMem()等函數。
返回到編輯框口中,在按鈕上面雙擊滑鼠,添加onchick事件,添加代碼,將GetcurrentDirectory函數的傳回值賦值給編輯框edit1.
儲存應用程式到,
測試程式。
程式部分代碼:------------------------------------
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls;
function GetCurrentDirectory:String;
var
nBufferLength:DWORD;
lpBuffer :PChar;
begin
nBufferLength:=MAX_PATH+1;
result:='';
GetMem(lpBuffer,nBufferLength);
try
if Windows.GetCurrentDirectory(nBufferLength,lpBuffer)>0 then
Result:=lpBuffer;
finally
freeMem(lpBuffer);
end;
end;