文件的拖放和打開拖拽

user shellapi type TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure AppMessage(var Msg: TMsg; var Handled: Boolean);///////消息處理函數 end; procedure TForm1.FormCreate(Sender: TObject); begin //設置需要處理文件WM_DROPFILES拖放消息 DragAcceptFiles(ListView1.Handle, TRUE); //設置AppMessage過程來捕獲所有消息 Application.OnMessage := AppMessage; end; procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean); var nFiles, I: Integer; Filename: string; ListItem: TListItem; begin // // 注意!所有消息都將通過這里! // 不要在此過程中編寫過多的或者需要長時間操作的代碼,否則將影響程序的性能 // // 判斷是否是發送到ListView1的WM_DROPFILES消息 if (Msg.message = WM_DROPFILES) and (msg.hwnd = ListView1.Handle) then begin // 取dropped files的數量 nFiles := DragQueryFile (Msg.wParam, $FFFFFFFF, nil, 0); // 循環取每個拖下文件的全文件名 for I := 0 to nFiles - 1 do////////支持拖動多個文件過來 begin // 為文件名分配緩沖 allocate memory SetLength (Filename, 80); // 取文件名 read the file name DragQueryFile (Msg.wParam, I, PChar (Filename), 80); Filename := PChar (Filename); //file://將全文件名分解程文件名和路徑 ////////FileName為拖過來的文件,包括文件全路徑。 ///////////////////////此處實現對文件的操作 end; //file://結束這次拖放操作 DragFinish (Msg.wParam); //file://標識已處理了這條消息 Handled := True; end; end;
拖動獲取文件路徑的技術

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, shellapi, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } public procedure WMDropFiles(var message:TMessage);message WM_DROPFILES; { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure tform1.WMDropFiles(var message:TMessage); //響應拖動事件,講文件的路徑放置到Memo控件中 var p:array[0..254] of char; i:word; begin inherited; memo1.lines.clear; i:=dragqueryfile(message.wparam,$ffffffff,nil,0); caption :=inttostr(i); for i:=0 to i-1 do begin dragqueryfile(message.wparam,i,p,255); //取得文件路徑 memo1.lines.Add(strpas(p)); end; end; procedure TForm1.FormCreate(Sender: TObject); //設定拖動句柄 begin dragacceptfiles(form1.handle,true); end; end. ============== object Form1: TForm1 Left = 211 Top = 186 Width = 396 Height = 173 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 13 object Memo1: TMemo Left = 80 Top = 32 Width = 193 Height = 73 Lines.Strings = ( 'Memo1') TabOrder = 0 end end
判斷文件是否為文本文件的函數
在用Delphi 編程處理文本文件的時候,如果要裝載的文件比較大,你可能會想在文件裝載過程中提供一個裝載進度的提示--那么你就必需自己編寫直接通過文件打開/讀取函數來裝載文件內容的函數。
在自己編寫文本文件讀取函數的時候,你首先會遇到的第一個問題就是:對於給定的一個文件名,怎么知道它所代表磁盤文件的確是文本文件?這里有一個很簡單的方法:把給定的那個文件看作是無類型的二進制文件,然后順序地讀出這個文件的每一個字節,如果文件里有一個字節的值等於0,那么這個文件就不是文本文件;反之,如果這個文件中沒有一個字節的值是0的話,就可以判定這個文件是文本文件了。這是原理,下面看看在Delphi 中怎樣編程來實現它--
代碼如下:

function IsTextFile(FileName:string):boolean; var Fs:TFileStream; i,size:integer; IsTextFile:boolean; ByteData:Byte; begin if FileExists(FileName) then begin Fs:=TFileStream.Create(FileName,fmOpenRead); IsTextFile:=true; i:=0; size:=Fs.Size; While (i<size) and IsTextFile do begin Fs.Read(ByteData,1); IsTextFile:=ByteData<>0; inc(i) end; Fs.Free; Result:=IsTextFile end else Result:=false end;
判斷文件路徑,不存在則建立

procedure TForm1.Act_CheckPath(FilePath:String); var MyFile:String; i:Integer; FileDir,TemStr:WideString; PosList,DirList:TStrings; begin PosList:=TStringList.Create; DirList:=TStringList.Create; MyFile:=FilePath+'\'; FileDir:=MyFile; //記錄'\'的位置; for i:=1 to Length(FileDir) do begin TemStr:=Copy(FileDir,i,1); if TemStr = '\' then PosList.Add(IntToStr(i)); end; for i:=0 to PosList.Count - 1 do begin DirList.Add(Copy(FileDir,1,StrToInt(PosList.Strings[i])-1)); end; for i:=0 to DirList.Count -1 do begin //判斷文件路徑是否存在 if not DirectoryExists(DirList.Strings[i]) then //不存在,則建立新路徑 CreateDir(DirList.Strings[i]); end; PosList.Free; DirList.Free; end;
判斷文件夾(目錄)是否存在,不存在就創建一個
Delphi判斷文件夾(目錄)是否存在,不存在就創建一個,可以一次創建多級目錄

procedure TForm1.Button1Click(Sender: TObject); begin if not FileExists(Edit1.Text) then //if not DirectoryExists(Edit1.Text) then 判斷目錄是否存在 try begin CreateDir(Edit1.Text); //ForceDirectories(Edit1.Text); 創建目錄 end; finally raise Exception.Create('Cannot Create '+Edit1.Text); end; end;
//該代碼片段來自於: http://www.sharejs.com/codes/delphi/8998
//三個函數引用自SysUtils單元

FileExists(Path)檢查目錄是否存在function FileExists(const FileName: string): Boolean; DirectorysExists(Path)創建目錄function DirectoryExists(const Directory: string): Boolean; CreateDirectory(Path)創建目錄function ForceDirectories(Dir: string): Boolean; ForceDirectories(Path)創建目錄 CreateDirectory(Path)創建目錄 forcedirectories和CreateDirectory都能創建文件 ForceDirectories可以創建多層目錄.
如果你創建一個目錄為c:\mymusic\music
如果你的C盤不存在一個叫mymusic的文件夾
的話程序會自動創建,函數執行的結果是,
創建了兩個文件夾,mymusic和music,music為
mymusic的子文件夾.
CreateDirectory只能創建一個文件夾,如果
mymusic不存在,則反回創建music文件夾失敗!
移動文件到已知路徑 用按鈕事件實現
Delphi的移動文件方法(轉)/刪除文件:/文件的復制
RenameFile,DeleteFile,MoveFile
Delphi的移動文件方法

uses ShellApi; procedure ShellFileOperation(fromFile: string; toFile: string; Flags: Integer); var shellinfo: TSHFileOpStructA; begin with shellinfo do begin wnd := Application.Handle; wFunc := Flags; pFrom := PChar(fromFile); pTo := PChar(toFile); end; SHFileOperation(shellinfo); end; // Example, Beispiel: procedure TForm1.Button1Click(Sender: TObject); begin ShellFileOperation('c:\afile.txt', 'd:\afile2.txt', FO_COPY); // To Move a file: FO_MOVE end;
該方法的另一種表示:

function TScanFileThread.MoveFile(FileName: string): Boolean; var F: TShFileOpStruct; begin with F do begin Wnd := Handle; wFunc := FO_MOVE; pFrom := PChar(Directory + FileName + #0#0); pTo := PChar(SaveDirectory + FileName + #0#0); fFlags := FOF_RENAMEONCOLLISION or FOF_NOCONFIRMMKDIR; end; if ShFileOperation(F) = 0 then begin Result := True; end else begin Result := False; end; end;
一開始pFrom和pTo沒有以“#0#0”結尾,結果發現在有的機器上能移動成功,有的機器上SHFileOperation返回1026無法轉移,查了一下資料
ShFileOperation中的pFrom和pTo中可以包含多個文件名,文件名之間用 '\0' 分割,最后以兩個\0結束。
/////////////////////////////////////////////////////////////////////////
1、

CopyFile(PChar(源目錄),PChar(目標目錄),True); CopyFileTo('F:\MyProject\delphi\message\data\data.mdb','c:\data.mdb');//不能覆蓋已存在的文件******//
//***************下面的這個WINAPI最后的一個參數為true時不覆蓋已經存在的文件。為false時自動覆蓋存在的文件。*********//
CopyFile(pchar(''+MyPath+'/data/data.mdb'),pchar(''+MyPath+'/data/backup.mdb'),false);
2、api的不會
我一般是在程序中根據程序所在目錄建立一個批處理文件
copy x:\xxx\xxx.exe c:;
exit;
在窗體創建或退出時執行;
因為在外地網吧,所以不能提供代碼,不過這個應該不難。
3、也可以直接調用shellexec winexec,
shellexec('copy gp.exe c:')
4、不用api的如下:

procedure CopyFile (SourceName, TargetName: String); var Stream1, Stream2: TFileStream; begin Stream1 := TFileStream.Create (SourceName, fmOpenRead); try Stream2 := TFileStream.Create (TargetName, fmOpenWrite or fmCreate); try Stream2.CopyFrom (Stream1, Stream1.Size); finally Stream2.Free; end finally Stream1.Free; end end;
5、如果是在本程序運行的時候復制本程序的話,可以這樣:

procedure Tform1.formCreate(Sender: TObject); var s:Pchar; begin s:= Pchar(Application.ExeName); copyfile(s, 'c:\a.exe', true); end;
6、CopyFile(PChar(源文件),PChar(目標文件),True);為False表示覆蓋
7、可以用以下的方法:
CopyFile(pchar('c:\sql.txt'), pchar('d:\sql.txt'), True);
只要是文件的復制,都可以。
移動文件:
MoveFile(pchar('c:\sql.txt'), pchar('d:\sql.txt'));
刪除文件:
DeleteFile('c:\sql.txt');
以上都是可行的。
判斷文件是否正在被使用
首先,我們先來認識下CreateFile函數,它的原型如下
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指針
DWORD dwDesiredAccess, //訪問模式(寫/讀)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全屬性的指針
DWORD dwCreationDisposition, //如何創建
DWORD dwFlagsAndAttributes, //文件屬性
HANDLE hTemplateFile //用於復制文件句柄
);
下面是參數的說明
lpFileName
指向一個空結尾字符串。該參數指定了用於創建或打開句柄的對象。
如果lpFileName的對象是一個路徑,則有一個最大字符數的限制。不能超過常量(MAX_PATH).這個限制指示了CreateFile函數如何解析路徑.
dwDesiredAccess
指定對象的訪問方式,程序可以獲得讀訪問權,寫訪問權,讀寫訪問權或者是詢問設備("device query") 訪問權.
這個參數可以是下列值的任意組合
0
指定詢問訪問權.程序可以在不直接訪問設備的情況下查詢設備的屬性.
GENERIC_READ
指定讀訪問權.可以從文件中讀取數據,並且移動文件指針.可以和GENERIC_WRITE組合成為"讀寫訪問權".
GENERIC_WRITE
指定寫訪問權.可以從文件中寫入數據,並且移動文件指針.可以和GENERIC_READ組合成為"讀寫訪問權".
dwShareMode
設置位標志指明對象如何共享.如果參數是0, 對象不能夠共享. 后續的打開對象的操作將會失敗,直到該對象的句柄關閉.
使用一個或多個下列值的組合來共享一個對象.
FILE_SHARE_DELETE
WINDOWS NT:后續的僅僅請求刪除訪問權的打開操作將會成功.
FILE_SHARE_READ
后續的僅僅請求讀訪問權的打開操作將會成功.
FILE_SHARE_WRITE
后續的僅僅請求寫訪問權的打開操作將會成功.
lpSecurityAttributes
指向一個 SECURITY_ATTRIBUTES 結構的指針用於確定如何在子進程中繼承這個句柄.如果這個參數是NULL,則該句柄不可繼承.
dwCreationDisposition
指定當文件存在或者不存在時如何動作。關於這個參數更多的信息,參考批注部分。這個參數必須是一個或多個下列值。
CREATE_NEW
創建一個新文件. 如果該文件已經存在函數則會失敗.
CREATE_ALWAYS
創建一個新文件.如果該文件已經存在,函數將覆蓋已存在的文件並清除已存在的文件屬性
OPEN_EXISTING
打開一個文件,如果文件不存在函數將會失敗.
如查你使用CreateFile函數為設備裝載控制台.請查看批注中的"為什么使用OPEN_EXISTING標志"的部分.
OPEN_ALWAYS
如果文件存在,打開文件. 如果文件不存在,並且參數中有CREATE_NEW標志,則創建文件.
TRUNCATE_EXISTING
打開一個文件,每次打開,文件將被截至0字節.調用進程必須用GENERIC_WRITE訪問模式打
開文件.如果文件不存在則函數就會失敗.
dwFlagsAndatributes
為文件指定屬性和標志位
該參數可以接收下列屬性的任意組合.除非其它所有的文件屬性忽略FILE_ATTRIBUTE_NORMAL.
FILE_ATTRIBUTE_ARCHIVE
文件將被存檔,程序使用此屬性來標志文件去備份或移除
FILE_ATTRIBUTE_HIDDEN
文件被隱藏,它不會在一般文件夾列表中被裝載.
FILE_ATTRIBUTE_NORMAL
文件沒有被設置任何屬性.
FILE_ATTRIBUTE_OFFLINE
文件的數據沒有被立即用到。指出正在脫機使用該文件。
FILE_ATTRIBUTE_READONLY
這個文件只可讀取.程序可以讀文件,但不可以在上面寫入內容,也不可刪除.
FILE_ATTRIBUTE_SYSTEM
文件是系統的一部分,或是系統專用的.
FILE_ATTRIBUTE_TEMPORARY
文件被使用后,文件系統將努力為(文件的)所有數據的迅迅訪問保持一塊
內存。臨時文件應當在程序不用時及時刪除。
dwFlagAndAttributes可以接受下列標志的任意組合。
FILE_FLAG_WRITE_THROUGH
指示系統通過快速緩存直接寫入磁盤.
FILE_FLAG_OVERLAPPED
指示系統初始化對象, 此操作將對進程設置一個引用計數並返回ERROR_IO_PENDING.處理完成后, 指定對象將被設置為信號狀態.當你指定FILE_FLAG_OVERLAPPED時,讀寫文件的函數必須指定一個OVERLAPPED結構.並且. 當FILE_FLAG_OVERLAPPED被指定, 程序必須執行重疊參數(指向OVERLAPPED結構)去進行文件的讀寫.這個標志也可以有超過一個操作去執行.
FILE_FLAG_NO_BUFFERING
指示系統不使用快速緩沖區或緩存,當和FILE_FLAG_OVERLAPPED組合,該標志給出最大的異步操作量, 因為I/O不依賴內存管理器的異步操作.然而,一些I/O操作將會運行得長一些,因為數據沒有控制在緩存中.當使用FILE_FLAG_NO_BUFFERING打開文件進行工作時,
程序必須達到下列要求:
文件的存取開頭的字節偏移量必須是扇區尺寸的整倍數.
文件存取的字節數必須是扇區尺寸的整倍數.例如,如果扇區尺寸是512字節程序就可以讀或者寫512,1024或者2048字節,但不能夠是335,981或者7171字節.
進行讀和寫操作的地址必須在扇區的對齊位置,在內存中對齊的地址是扇區尺寸的整倍數.
一個將緩沖區與扇區尺寸對齊的途徑是使用VirtualAlloc函數. 它分配與操作系統內存頁大小的整倍數對齊的內存地址.因為內存頁尺寸和扇區尺寸--2都是它們的冪.
這塊內存在地址中同樣與扇區尺寸大小的整倍數對齊.
程序可以通過調用GetDiskFreeSpace來確定扇區的尺寸.

FILE_FLAG_RANDOM_ACCESS 指定文件是隨機訪問,這個標志可以使系統優化文件的緩沖. FILE_FLAG_SEQUENTIAL_SCAN 指定文件將從頭到尾連續地訪問.這個標志可以提示系統優化文件緩沖. 如果程序在隨機訪問文件中移動文件指針,優化可能不會發生;然而,正確的操作仍然可以得到保證 指定這個標志可以提高程序以順序訪問模式讀取大文件的性能, 性能的提高在許多程序讀取一些大的順序文件時是異常明顯的.但是可能會有小范圍的字節遺漏. FILE_FLAG_DELETE_ON_CLOSE 指示系統在文件所有打開的句柄關閉后立即刪除文件.不只有你可以指定FILE_FLAG_DELETE_ON_CLOSE如果沒有使用FILE_SHARE_DELETE,后續的打開文件的請求將會失敗. FILE_FLAG_BACKUP_SEMANTICS WINDOWS NT:指示系統為文件的打開或創建執行一個備份或恢復操作. 系統保證調用進程忽略文件的安全選項,倘若它必須有一個特權.則相關的特權則是SE_BACKUP_NAME和SE_RESTORE_NAME. 你也可以使用這個標志獲得一個文件夾的句柄,一個文件夾句柄能夠象一個文件句柄一樣傳給某些Win32函數。 FILE_FLAG_POSIX_SEMANTICS 指明文件符合POSIX標准.這是在MS-DOS與16位Windows下的標准. FILE_FLAG_OPEN_REPARSE_POINT 指定這個標志制約NTFS分區指針.該標志不能夠和CREAT_ALWAYS一起使用. FILE_FLAG_OPEN_NO_RECALL 指明需要文件數據,但是將繼續從遠程存儲器中接收.它不會將數據存放在本地存儲器中. 這個標志由遠程存儲系統或等級存儲管理器系統使用. hTemplateFile 為GENERIC_READ訪問的模式指定一個句柄到模板文件.模板文件在文件開始創建后提供文件屬性和擴展屬性. Return Values 返回值
如果函數成功,返回一個打開的指定文件的句柄.如果指定文件在函數調用前已經存在並且dwCreation參數是CREATE_ALWAYS 或者OPEN_ALWAYS,調用GetLastError就會返回ERROR_ALREADY_EXISTS(表示函數成功). 如果函數文件在調用前不存在則會返回0.
如果函數失敗,返會值會是INVALID_HANDLE_VALUE. 更多的錯誤信息可以調用GetLastError來獲得.
==================================================================================
“判斷文件是否正在被使用”的函數更容易理解一些,函數如下:

function IsFileInUse(fName : string) : boolean; var HFileRes : HFILE; begin Result := false; //返回值為假(即文件不被使用) if not FileExists(fName) then exit; //如果文件不存在則退出 HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0 {this is the trick!}, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); //如果CreateFile返回失敗 那么Result為真(即文件正在被使用) if not Result then //如果CreateFile函數返回是成功 CloseHandle(HFileRes); //那么關閉句柄 end;
函數的調用方法:IsFileInUse(要判斷的文件路徑); 如果函數返回True 則正在使用,False則文件現在沒被使用
取得桌面文件夾的路徑和取得我的文檔的路徑

function GetShellFolders(strDir: string): string; const regPath = '\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'; var Reg: TRegistry; strFolders: string; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey(regPath, false) then begin strFolders := Reg.ReadString(strDir); end; finally Reg.Free; end; result := strFolders; end; {獲取桌面} function GetDeskeptPath: string; begin Result := GetShellFolders('Desktop'); //是取得桌面文件夾的路徑 end; {獲取我的文檔} function GetMyDoumentpath: string; begin Result := GetShellFolders('Personal'); //我的文檔 end;
文件夾操作

uses ShellApi //建立文件夾 procedure TfrmMain.cxButton1Click(Sender: TObject); begin CreateDirectory(PChar(ExtractFilePath(ParamStr(0))+ 'Microblue'),nil); end; //刪除文件夾,放到回收站 procedure TfrmMain.cxButton2Click(Sender: TObject); var T: TSHFileOpStruct; P: String; begin P := ExtractFilePath(ParamStr(0)) + 'Microblue'; with T do begin Wnd := 0; wFunc := FO_DELETE; pFrom := PChar(P); pTo := nil; fFlags := FOF_ALLOWUNDO + FOF_NOERRORUI; hNameMappings := nil; lpszProgressTitle := '正在刪除文件夾'; fAnyOperationsAborted := False; end; if SHFileOperation(T) = 0 then begin ShowMessage('刪除成功!'); end else begin ShowMessage('刪除失敗!'); end; end; //直接刪除文件夾 procedure TfrmMain.cxButton3Click(Sender: TObject); begin RemoveDirectory (Pchar(ExtractFilePath(ParamStr(0))+ 'Microblue')); end; 移動文件夾 用 SHFileOperation 這個吧,它能做的事情實在太多了,在MSDN查查這個函數,相信你收獲一定不少,呵呵: use Shellapi; //記得 use Shellapi function MoveDir(const aSrc, aDst: String): Boolean; var sfo: TShFileOpStruct; i: Integer; begin FillChar(sfo,SizeOf(TShFileOpStruct),0); sfo.fFlags:=FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_SILENT or FOF_ALLOWUNDO; sfo.Wnd:=0; sfo.wFunc:=FO_MOVE; sfo.pFrom:=PChar(aSrc); sfo.pTo:=PChar(aDst); Result:=not BOOL(SHFileOperation(sfo)); end; procedure TForm1.FormCreate(Sender: TObject); begin SHOWMESSAGE(BoolToStr(MoveDir('C:\www','D:\abcd'),True)); end;
獲取文件夾目錄列表

procedure TForm1.Button1Click(Sender: TObject); var vStr: TStringList; i: Integer; begin vStr := TStringList.Create; findall('E:\', 'test', vStr); for i := 0 to vStr.Count - 1 do ShowMessage(vStr[i]); vStr.Free; end; procedure TForm1.findall(disk, path: String; var fileresult: TStringList); var fpath, s: String; fs: TsearchRec; begin fpath := disk + path + '\*.*'; if FindFirst(fpath, faAnyFile, fs) = 0 then begin if (fs.Name <> '.') and (fs.Name <> '..') then if (fs.Attr and faDirectory) = faDirectory then findall(disk, path + '\' + fs.Name, fileresult) else fileresult.add(strpas(strupper(pchar(path))) + '\' + strpas (strupper(pchar(fs.Name))) + '(' + inttostr(fs.Size) + ')'); while findnext(fs) = 0 do begin if (fs.Name <> '.') and (fs.Name <> '..') then if (fs.Attr and faDirectory) = faDirectory then findall(disk, path + '\' + fs.Name, fileresult) else begin fileresult.add(path + '\' + strpas(strupper(pchar(fs.Name))) + '(' + inttostr(fs.Size) + ')'); end; end; end; Findclose(fs); end;
程序獲取自身運行目錄的方法
Delphi 在啟動應用程序時與 C 語言一樣會傳遞命令行參數給應用程序,第一個參數(索引號為零)表示應用程序本身的文件名(包括完整的路徑),這個 String 參數由函數 ParamStr(0) 返回。 順便說一句,Delphi 提供了分析文件名的多個函數,如果你需要從文件名中得到路徑名,可用下面的兩個函數,這兩個函數有一點點微小的差別: ExtractFilePath(FileName:String) 該函數返回路徑名,其結尾字符總是“\” ExtractFileDir(FileName:String) 該函數同樣返回路徑名,但不包括結尾的字符“\”,除非返回的路徑是根目錄。 例如:獲取當前程序的路徑時就應該這樣寫 var path:string; ……… path:=ExtractFilePath(ParamStr(0)); 如果調用同一目錄下的aa.ini文件,就應該這樣寫 inifilename:string; inifilename:=path+'aa.ini'; 另外,Delphi自己還提供了一個取得當前目錄的函數:GetCurrentDir,返回值不包括結尾的字符“\”,除非返回的路徑是根目錄。以下是個例子: inifilename:=GetCurrentDir + '\abc.txt'; 需要注意的是,GetCurrentDir只有在程序剛運行時取得的是程序運行目錄,如果運行過程中改變過當前目錄,則該函數返回的結果也會跟着改變。