delphi 文件夾操作


文件的拖放和打開拖拽

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;
View Code

拖動獲取文件路徑的技術

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
View Code

 

判斷文件是否為文本文件的函數

在用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;
View Code

判斷文件路徑,不存在則建立

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; 
View Code

判斷文件夾(目錄)是否存在,不存在就創建一個

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;
View Code

//該代碼片段來自於: 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可以創建多層目錄. 
View Code

如果你創建一個目錄為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;
View Code

該方法的另一種表示:

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;
View Code

一開始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');//不能覆蓋已存在的文件******//
View Code

//***************下面的這個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;
View Code

5、如果是在本程序運行的時候復制本程序的話,可以這樣:

procedure Tform1.formCreate(Sender: TObject);

var

s:Pchar;

begin

s:= Pchar(Application.ExeName);

copyfile(s, 'c:\a.exe', true);

end;
View Code

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
返回值
View Code

如果函數成功,返回一個打開的指定文件的句柄.如果指定文件在函數調用前已經存在並且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;
View Code

函數的調用方法: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;
View Code

文件夾操作

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;
View Code

獲取文件夾目錄列表

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;
View Code

程序獲取自身運行目錄的方法

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只有在程序剛運行時取得的是程序運行目錄,如果運行過程中改變過當前目錄,則該函數返回的結果也會跟着改變。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM