程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第六章-文件管理(三)(2)

第六章-文件管理(三)(2)

編輯:Delphi

6.4.5.2 文件拷貝、移動、刪除、更名 

文件拷貝的關鍵是使用了以文件句柄為操作對象的文件管理函數,因而提供了一種底層的I/O通道。在Object Pascal中這一點是利用無類型文件實現的。

在文件拷貝中首先檢查目標文件名是否是一個目錄。如是則把原文件的文件名添加到目標路徑後,生成目標文件全路徑名。而後提取源文件的時間戳,以備拷貝完成後設置目標文件。拷貝過程中使用了返回文件句柄或以文件句柄為參數的文件管理函數FileOpen、FileCreate、FileRead、FileWrite、FileClose。為保證文件的正常關閉和內存的釋放,在拷貝過程中進行異常保護。

過程CopyFile實現上述功能,它定義在fmxutils單元中。 

procedure CopyFile(const FileName, DestName: TFileName);

var

CopyBuffer: Pointer;

TimeStamp, BytesCopied: Longint;

Source, Dest: Integer;

Destination: TFileName;

const

ChunkSize: Longint = 8192;

begin

Destination := ExpandFileName(DestName);

if HasAttr(Destination, faDirectory) then

Destination := Destination + '\' + ExtractFileName(FileName);

TimeStamp := FileAge(FileName);

GetMem(CopyBuffer, ChunkSize);

try

Source := FileOpen(FileName, fmShareDenyWrite);

if Source < 0 then

raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));

try

Dest := FileCreate(Destination);

if Dest < 0 then

raise EFCreateError.Create(FmtLoadStr(SFCreateError,[Destination]));

try

repeat

BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize);

if BytesCopied > 0 then

FileWrite(Dest, CopyBuffer^, BytesCopied);

until BytesCopied < ChunkSize;

finally

FileSetDate(Dest,TimeStamp);

FileClose(Dest);

end;

finally

FileClose(Source);

end;

finally

FreeMem(CopyBuffer, ChunkSize);

end;

end;

如果我們不使用FileSetDate過程,Windows自動把當前時間作為時間戳寫入文件。

文件移動事實上是文件拷貝與文件刪除的結合。fmxutils單元中的MoveFile過程實現了這一功能。 

procedure MoveFile(const FileName, DestName: TFileName);

var

Destination: TFileName;

begin

Destination := ExpandFileName(DestName);

if not RenameFile(FileName, Destination) then

begin

if HasAttr(FileName, faReadOnly) then

raise EFCantMove.Create(Format(SFCantMove, [FileName]));

CopyFile(FileName, Destination);

DeleteFile(FileName);

end;

end; 

EFCanMove是一個自定義異常類: 

type

EFCanMove := Class(EStreamError);

有關自定義異常類請參閱第十二章。

文件刪除、文件更名直接調用Delphi文件管理過程DeleteFile、RenameFile。它們都以文件名為參數。操作執行前應彈出一個對話框進行確認,執行完畢後應調用Update方法更新FileList的顯示。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved