Delphi 文件操作(路徑、目錄)


Delphi利用系統環境變量獲取常用系統目錄

//譬如 %WINDIR% 是表示系統目錄的系統變量, 可以這樣獲取:

var
s: string;
begin
s := GetEnvironmentVariable('WINDIR');
ShowMessage(s); {C:\WINDOWS}
end;
View Code

一些系統目錄變量列表:

--------變量-----------------------------,-------描述-------------------------------------------
%WINDIR% {系統目錄 - C:\WINDOWS}
%SYSTEMROOT% {系統目錄 - C:\WINDOWS}
%SYSTEMDRIVE% {系統根目錄 - C:}
%HOMEDRIVE% {當前用戶根目錄 - C:}
%USERPROFILE% {當前用戶目錄 - C:\Documents and Settings\wy}
%HOMEPATH% {當前用戶路徑 - \Documents and Settings\wy}
%TMP% {當前用戶臨時文件夾 - C:\DOCUME~1\wy\LOCALS~1\Temp}
%TEMP% {當前用戶臨時文件夾 - C:\DOCUME~1\wy\LOCALS~1\Temp}
%APPDATA% {當前用戶數據文件夾 - C:\Documents and Settings\wy\Application Data}
%PROGRAMFILES% {程序默認安裝目錄 - C:\Program Files}
%COMMONPROGRAMFILES% {文件通用目錄 - C:\Program Files\Common Files}
%USERNAME% {當前用戶名 - wy}
%ALLUSERSPROFILE% {所有用戶文件目錄 - C:\Documents and Settings\All Users}
%OS% {操作系統名 - Windows_NT}
%COMPUTERNAME% {計算機名 - IBM-B63851E95C9}
%NUMBER_OF_PROCESSORS% {處理器個數 - 1}
%PROCESSOR_ARCHITECTURE% {處理器芯片架構 - x86}
%PROCESSOR_LEVEL% {處理器型號 - 6}
%PROCESSOR_REVISION% {處理器修訂號 - 0905}
%USERDOMAIN% {包含用戶帳號的域 - IBM-B63851E95C9}
%COMSPEC% {C:\WINDOWS\system32\cmd.exe}
%PATHEXT% {執行文件類型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.pyo;.pyc;.py;.pyw}
View Code

 獲取程序的路徑

Delphi 在啟動應用程序時與 C 語言一樣會傳遞命令行參數給應用程序,第一個參數(索引號為零)表示應用程序本身的文件名(包括完整的路徑),這個 String 參數由函數 ParamStr(0) 返回。
順便說一句,Delphi 提供了分析文件名的多個函數,如果你需要從文件名中得到路徑名,可用下面的兩個函數,這兩個函數有一點點微小的差別:
ExtractFilePath(FileName:String) 該函數返回路徑名,其結尾字符總是“\”
ExtractFileDir(FileName:String) 該函數同樣返回路徑名,但不包括結尾的字符“\”,除非返回的路徑是根目錄。
例如:獲取當前程序的路徑時就應該這樣寫

var    
patch:string;
………
patch:=ExtractFilePath(ParamStr(0));
如果調用同一目錄下的aa.ini文件,就應該這樣寫
inifilename:string;
inifilename:=patch+'aa.ini';

獲取臨時文件夾路徑

//聲明:  
GetTempPath(  
  nBufferLength: DWORD; {緩沖區大小}  
  lpBuffer: PChar       {緩沖區}  
): DWORD;               {返回實際長度}  

//舉例:  
var  
  arr: array[0..MAX_PATH] of Char;  
  num: DWORD;  
begin  
  num := GetTempPath(MAX_PATH, arr);  
  ShowMessage(arr);           {C:\DOCUME~1\wy\LOCALS~1\Temp\}  
  ShowMessage(IntToStr(num)); {29}  
end;  
View Code

獲取系統特殊文件夾

我們在編寫程序的時候,經常會需要得到系統中的一些特殊目錄,例如:桌面、收藏夾、歷史文件、字體等。在windows98、windows NT、Windows 2000中他們的位置是不一樣的,尤其在windows2000和wodows NT中,他們的位置隨着登陸用戶的不同而改變。那么我們要如何取得這些特殊目錄的具體位置呢?
當然是利用Api函數,現在我介紹兩個Api函數,利用他們就可以輕松簡單的獲取這些特殊系統目錄。
Function SHGetSpecialFolderLocation(hwndOwner: HWND; nFolder: Integer;
var ppidl: PItemIDList): HResult; stdcall;
Function SHGetPathFromIDList(pidl: PItemIDList; pszPath: PChar): BOOL;stdcall;
其中由nFolder參數指定的就是各個特殊系統目錄:
CSIDL_DESKTOP:毫無疑問這就是桌面;
CSIDL_DRIVERS:我的電腦;
CSIDL_FAVORITES:收藏夾;
CSIDL_STARTUP:開始菜單;
CSIDL_NETWORK:網上鄰居;
還有很多,你可以查閱一下Delphi的Win32 Api函數的幫助文件,不過在幫助文件下的這些參數也不是很全,像收藏夾幫助文件里面就沒有,你可以查閱一下它的頭文件:shlobj.pas。
下面我就利用這兩個函數取得桌面的路徑(在win98和win2000下都可以使用):

uses shlobj;
var
pitem:PITEMIDLIST;
s:string;
begin
shGetSpecialFolderLocation(handle,CSIDL_DESKTOP,pitem);
setlength(s,100);
shGetPathFromIDList(pitem,pchar(s));
end;
View Code

在字符串s中存儲的就是桌面的路徑值。簡單吧!就是這么簡單,但要是你不知道,你就得繞一個大圈子。

獲取文件所在路徑

//delphi 獲取文件所在路徑

ExtractFileDrive :返回完整文件名中的驅動器,如"C:"
ExtractFilePath:返回完整文件名中的路徑,最后帶“/”,如"C:/test/"
ExtractFileDir:返回完整文件名中的路徑,最后不帶“/” ,如"C:/test"
ExtractFileName:返回完整文件名中的文件名稱 (帶擴展名),如"mytest.doc"
ExtractFileExt 返回完整文件名中的文件擴展名(帶.),如".doc"

ExtractRelativePath : 返回相對路徑,定義如下:
function ExtractRelativePath(const BaseName, DestName: string): string;
使用測試下如:
SysUtils.ExtractRelativePath('C:/test','C:/Test/TestRelativePath'):返回TestRelativePath
SysUtils.ExtractRelativePath('C:/Test/TestRelativePath','C:/test'):返回'../TestRelativePath'
SysUtils.ExtractRelativePath('C:/Test/TestRelativePath/','C:/test'):返回'../../TestRelativePath'
ExtractShortPathName :返回短文件名,即8+3,文件名長八位,擴展名為3號,為保持DOS系統兼容而存在
 
若想獲取的文件名不帶路徑,可用:
ChangeFileExt(TIdAttachment(Msg.MessageParts.Items[intIndex]).Filename,''); 函數將擴展名改掉即可.目前好象就這一種辦法,誰還有更好的辦法?請告知
 
 
另附其它地方的資料:
 
1、文件名函數 
  文件名函數可以對文件的名稱、所在子目錄、驅動器和擴展名等進行操作。下表列出這些函數及其功能。 
函數 說明 
ExpandFileName() 返回文件的全路徑(含驅動器、路徑) 
ExtractFileExt() 從文件名中抽取擴展名 
ExtractFileName() 從文件名中抽取不含路徑的文件名 
ExtractFilePath() 從文件名中抽取路徑名 
ExtractFileDir() 從文件名中抽取目錄名 
ExtractFileDrive() 從文件名中抽取驅動器名 
ChangeFileExt() 改變文件的擴展名 
ExpandUNCFileName() 返回含有網絡驅動器的文件全路徑 
ExtractRelativePath() 從文件名中抽取相對路徑信息 
ExtractShortPathName() 把文件名轉化為DOS的8·3格式 
MatchesMask() 檢查文件是否與指定的文件名格式匹配
ExtractFilePath(FileName:String)
該函數返回路徑名,其結尾字符總是“/”
ExtractFileDir(FileName:String)
該函數同樣返回路徑名,但不包括結尾的字符“/”,除非返回的路徑是根目錄。
  下面就把這些函數作一一介紹: 
⑴ExpandFileName() 
  原型:extern PACKAGE AnsiString __fastcall ExpandFileName(const AnsiString FileName); 
  功能:返回文件的全路徑(含驅動器、路徑) 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExpandFileName(Application->ExeName));//顯示你的程序文件名,如C:/MyBCB/Sample1.EXE 
⑵ExtractFileExt() 
  原型:extern PACKAGE AnsiString __fastcall ExtractFileExt(const AnsiString FileName); 
  功能:從文件名中抽取擴展名 
  參數:FileName:要處理的文件名(全路徑) 
  例:ShowMessage(ExtractFileExt(Application->ExeName));//顯示".exe" 
⑶ExtractFileName() 
  原型:extern PACKAGE AnsiString __fastcall ExtractFileName(const AnsiString FileName); 
  功能:從文件名中抽取不含路徑的文件名 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExtractFileExt("c://Winnt//SOL.EXE"));//顯示"SOL.EXE" 
⑷ExtractFilePath() 
  原型:extern PACKAGE AnsiString __fastcall ExtractFilePath(const AnsiString FileName); 
  功能:從文件名中抽取路徑名 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExtractFilePath("Winnt//SOL.EXE"));//顯示"Winnt/" 
⑸ExtractFileDir() 
  原型:extern PACKAGE AnsiString __fastcall ExtractFileDir(const AnsiString FileName); 
  功能:從文件名中抽取目錄名(和上個函數不同,不包括最后的"/") 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExtractFileDir("Winnt//SOL.EXE"));//顯示"Winnt",注意和上個函數的區別 
⑹ExtractFileDrive() 
  原型:extern PACKAGE AnsiString __fastcall ExtractFileDrive(const AnsiString FileName); 
  功能:從文件名中抽取驅動器名 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExtractFileDrive("c://Winnt//SOL.EXE"));//顯示"c:" 
⑺ChangeFileExt() 
  原型:extern PACKAGE System::AnsiString __fastcall ChangeFileExt(const System::AnsiString FileName, const System::AnsiString Extension); 
  功能:更改文件名的擴展名,不是對真正的文件進行改名,只是對文件名這個字符串進行處理 
  參數:FileName:要改名的文件名,Extension:新的擴展名 
  例:ShowMessage(ChangeFileExt("c://Winnt//SOL.EXE",".OOO"));//顯示"c:/winnt/SOL.OOO" 
⑻ExpandUNCFileName() 
  原型:extern PACKAGE AnsiString __fastcall ExpandUNCFileName(const AnsiString FileName); 
  功能:返回含有網絡驅動器的文件全路徑,格式為://機器名/共享名/文件名 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExpandUNCFileName("F://Winnt//SOL.EXE"));/*如果F:是映射的網絡驅動器,則顯示"
⑼ExtractRelativePath() 
  原型:extern PACKAGE AnsiString __fastcall ExtractRelativePath(const AnsiString BaseName, const AnsiString DestName); 
  功能:從文件名中抽取相對路徑信息,如"../sss/ss.asd"這種形式 
  參數:BaseName:基准文件名;DestName:目標文件名 
  例:ShowMessage(ExtractRelativePath("D://Source//c//1.123","D://Source//Asm//dz.asm"));/*顯示"../asm/dz.asm"*/ 
⑽ExtractShortPathName() 
  原型:extern PACKAGE AnsiString __fastcall ExtractShortPathName(const AnsiString FileName); 
  功能:把文件名轉換為DOS的8、3格式 
  參數:FileName:要處理的文件名 
  例:ShowMessage(ExtractShortPathName("E://Program Files//Dual Wheel Mouse//4dmain.exe"));/*顯示"E:/Progra~1/dualwh~1/4dmain.exe"*/ 
⑾MatchesMask() 
  原型:extern PACKAGE bool __fastcall MatchesMask(const AnsiString Filename, const AnsiString Mask); 
  功能:檢查文件是否與指定的文件名格式匹配 
  參數:FileName:要處理的文件名;Mask:文件名格式,支持通配符 
  例:ShowMessage(MatchesMask("Lxf.exe","*.?x?));//顯示"true" 
View Code

 

返回臨時文件夾文件路徑

function GetExePath: string;
begin
  Result := ExtractFilePath(ParamStr(0));
end;

function GetTempFileName: string;
var
  vPath: string;
begin
  SetLength(Result, 255);
  GetTempFileName(PChar(GetExePath), PChar('~'), 0, PChar(result));
    
  vPath := GetExePath + 'temp\';
  if not SysUtils.DirectoryExists(vPath) then
    SysUtils.ForceDirectories(vPath);
  result := PChar(Result); //去掉多余的空字符
  Result := vPath + ExtractFileName(Result);
end;
View Code

 文件路徑問題

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    OpenDialog1: TOpenDialog;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute() then
begin
   LabeledEdit1.Text:= OpenDialog1.FileName;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.Execute() then
begin
   LabeledEdit2.Text:= OpenDialog1.FileName;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//RenameFile('Oldname', 'Newname');
MoveFile(PChar(LabeledEdit1.Text), PChar(LabeledEdit2.Text));
end;
function ReFileName(filepath: string): string;
begin
  result := ChangeFileExt(ExtractFileName(filepath), '');
  {
    Edit4.Text:=paramstr(0);//C:\FILE\Project1.exe
    Edit2.Text:=ExtractFilePath(Application.ExeName);//C:\FILE\
    Edit1.Text:=ExtractFileName(Application.ExeName);//Project1.exe
    Edit3.Text:=ExtractFileExt(Application.ExeName);//.exe
    }
end;
if FileExists(extractFilePath(application.exeName)+'newFile\123.txt') 
then 
label2.Caption :='創建成功' 
else 
label2.Caption :='創建失敗'; 
end; 
end.
View Code

 文件路徑相關的字符串操作

//delphi文件路徑相關的字符串操作
uses
  HTTPApp, Masks;

procedure TForm1.Button1Click(Sender: TObject);
var
  ss,s: string;
begin
  //先提取一個文件名的字符串
  ss := Application.ExeName;
  ShowMessage(ss); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects\Project1.exe

  //路徑
  s := ExtractFilePath(ss);
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects\

  //所在文件夾
  s := ExtractFileDir(ss);
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects

  //所在邏輯盤
  s := ExtractFileDrive(ss);
  ShowMessage(s); //C:

  //文件名
  s := ExtractFileName(ss);
  ShowMessage(s); //Project1.exe

  //文件擴展名
  s := ExtractFileExt(ss);
  ShowMessage(s); //.exe

  //相對路徑
  s := ExtractRelativePath('C:\Documents and Settings\wy\My Documents\',ss);
  ShowMessage(s); //RAD Studio\Projects\Project1.exe

  //dos下的短文件名
  s := ExtractShortPathName(ss);
  ShowMessage(s); //C:\DOCUME~1\wy\MYDOCU~1\RADSTU~1\Projects\Project1.exe

  //轉換到Unix路徑格式, 需要 uses HTTPApp
  s := DosPathToUnixPath(ss);
  ShowMessage(s); //C:/Documents and Settings/wy/My Documents/RAD Studio/Projects/Project1.exe

  //轉Unix路徑格式為Window格式, 是 DosPathToUnixPath 的逆操作
  s := ExpandUNCFileName(DosPathToUnixPath(ss));
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects\Project1.exe

  //去掉結尾的路徑分隔符
  s := ExcludeTrailingPathDelimiter(ExtractFilePath(ss));
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects

  //去掉結尾的路徑分隔符, 只是調用:ExcludeTrailingPathDelimiter
  s := ExcludeTrailingBackslash(ExtractFilePath(ss));
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects

  //更換擴展名, 並不修改文件, 只是替換字符串:
  s := ChangeFileExt(ss,'.bak');
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects\Project1.bak

  //更換文件路徑:
  s := ChangeFilePath(ss,'c:\temp');
  ShowMessage(s); //c:\temp\Project1.exe

  //判斷第幾個字符是否是路徑分隔符:
  IsPathDelimiter(ss,3); //返回 True

  //判斷后綴名是不是 exe; 需要 uses Masks
  MatchesMask(ss,'*.exe'); //返回 True
end;
--------------------------------------------------------------------------------

//分解 ProcessPath (需要 uses FileCtrl)
var
  s,p,f: string;
  d: Char;
begin
  s := ParamStr(0);
  ShowMessage(s); //C:\Documents and Settings\wy\My Documents\RAD Studio\Projects\Project1.exe
  ProcessPath(s,d,p,f);
  ShowMessage(d); //C
  ShowMessage(p); //\Documents and Settings\wy\My Documents\RAD Studio\Projects
  ShowMessage(f); //Project1.exe
end;
--------------------------------------------------------------------------------

//壓縮顯示 MinimizeName (需要 uses FileCtrl)
var
  s: string;
begin
  s := ParamStr(0);
  s := MinimizeName(s,Self.Canvas,100);
  ShowMessage(s); //C:\...\Project1.exe
end;
View Code

搜索文件夾和文件

function FindFile(Path: string): string; {搜索文件夾和文件}
var
 Sr: TSearchRec;
  CommaList: TStringList;
  s: string;
  dt: TDateTime;
begin
  commalist := Tstringlist.Create;
  try
    Findfirst(path + '*.*', faAnyFile, sr);
    if ((Sr.Attr and faDirectory) > 0) and (Sr.Name <> '.') then
    begin
      dt := FileDateToDateTime(sr.Time);
      s := FormatDateTime('yyyy-mm-dd hh:nn', dt);
      commalist.add('*' + s + sr.name);
    end;
    while findnext(sr) = 0 do
    begin
      if ((Sr.Attr and faDirectory) > 0) and (Sr.Name <> '..') then
      begin
        dt := FileDateToDateTime(sr.Time);
        s := FormatDateTime('yyyy-mm-dd hh:nn', dt);
        commalist.add('*' + s + sr.name);
      end;
    end;
    FindClose(sr);
    FindFirst(path + '*.txt', faArchive + faReadOnly + faHidden + faSysFile, Sr);
    if Sr.Attr <> faDirectory then
    begin
      dt := FileDateToDateTime(sr.Time);
      s := FormatDateTime('yyyy-mm-dd hh:nn', dt);
      commalist.add('\' + s+ Format('%.0n', [sr.Size / 1]) + '|' + sr.name);
    end; //Inttostr(
    while findnext(sr) = 0 do
    begin
      if (sr.Attr <> faDirectory) then
      begin
        dt := FileDateToDateTime(sr.Time);
        s := FormatDateTime('yyyy-mm-dd hh:nn', dt);
        commalist.add('\' + s +Format('%.0n', [sr.Size / 1]) + '|' + sr.name);
      end;
    end;
    FindClose(Sr);
  except
  end;
  Result := commalist.Text;     //Result是消息的 定義
  commalist.Free;
end;
View Code

搜索指文件,幷獲取該文件的完整路徑

procedure TForm1.GetDirFileNameList(sDirPath, sExt: string);
var
  sr: TSearchRec;

  function StrInFileName(s1, sName: string): Boolean;
  var
    str1, str2: string;
  begin
    Result := False;
    str1 := UpperCase(sName);
    str2 := UpperCase(Copy(s1, 1, Pos('.', s1)-1));
    if Pos(str2, str1) > 0 then  Result := True;
  end;
begin
  if DirectoryExists(sDirPath) then
  begin
    if FindFirst(sDirPath + '\*.*', faAnyFile, sr) = 0 then
    begin
      if (sr.Name <> '.') and (sr.Name <> '..') and  StrInFileName(sExt, sr.Name) then
        Memo1.Lines.Add(sDirPath + '\' + sr.Name);
      while (FindNext(sr) = 0) do
      begin
        if (sr.Name <> '.') and (sr.Name <> '..') and StrInFileName(sExt, sr.Name) then
          Memo1.Lines.Add(sDirPath + '\' + sr.Name);
      end;
    end;
    FindClose(sr);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetDirFileNameList('E:\king', '123.exe');
end;
View Code

軟件實現雙擊打開文件

unit shjAssociateFileType;

interface
uses Windows, Registry;
{將文件類型strFileExtension與程序strExeFileName相關聯,strDiscription為文件類型說明}
function AssignToProgram(const strFileExtension, strDiscription, strExeFileName: string ): boolean;
implementation
{將文件類型strFileExtension與程序strExeFileName相關聯,strDiscription為文件類型說明}
function AssignToProgram(const strFileExtension, strDiscription, strExeFileName: string ): boolean;
var
  regFile: TRegistry;
begin
  //建立一個Registry實例
  regFile := TRegistry.Create;
  with regFile do
  begin
    //設置根鍵值為HKEY_CLASSES_ROOT
    RootKey := HKEY_CLASSES_ROOT;
    //創建或者打開擴展名自動關聯注冊鍵
    OpenKey( '.' + strFileExtension, true);
    //設置擴展名自動關聯
    WriteString('', strFileExtension + '_Auto_File');
    //關閉鍵
    CloseKey;
    //創建或者打開打開自動關聯鍵
    OpenKey(strFileExtension + '_Auto_File', true);
    //設置文件類型說明
    WriteString('', strDiscription);
    //關閉鍵
    CloseKey;
    //創建或打開關聯程序鍵
    OpenKey(strFileExtension + '_Auto_File\shell\open\command', true);
    //設置關聯程序(注意:%1加上雙引號,可以解決文件路徑中含空格的問題)
    WriteString('',strExeFileName + ' "%1"');
    //關閉鍵
    CloseKey;
    //打開默認圖標鍵
    OpenKey(strFileExtension + '_Auto_File\defaulticon',true);
    //關聯默認圖標
    WriteString('', strExeFileName + ',0');
    //釋放
    Free;
    Result := True;
  end;
end;
end.
View Code

軟件實現拖拽打開文件

//聲明
protected
    procedure WMDROPFILES(var Msg : TMessage); message WM_DROPFILES;
------------------------------------------------------------------------------------------------------------------------
//實現
procedure TFormMain.WMDROPFILES(var Msg: TMessage);
var
  i, n: Integer;
  Buffer: Array[0..255] of Char;
begin
  //得到拖拽文件數量
  n := DragQueryFile(Msg.wParam, $FFFFFFFF, Buffer, 255);
  //處理選擇多個文件
  for i := 0 to n - 1 do
  begin
    //獲取拖拽文件名
    DragQueryFile(Msg.wParam, i, Buffer, 255);
    //文件名就在Buffer里面了
    if UpperCase(ExtractFileExt(Buffer)) = '.BZLX' then
    begin
      //判斷文件是否已經打開
      if UpperCase(Buffer) = UpperCase('test.bzlx') then
      begin
        MessageDlg('文件test.bzlx已經打開!', (mtInformation),[mbOK],0);
        exit;
      end;
      //打開文件
      OpenFile(Buffer);
      exit;
    end;
  end;
  //結束拖拽
  DragFinish(Msg.wParam);
end; 
------------------------------------------------------------------------------------------------------------------------
//初始化
procedure TFormMain.FormCreate(Sender: TObject);
begin
  //使窗口句柄可以接收拖拽操作
  DragAcceptFiles(Handle, True);
end;
View Code

文件拖拽獲取路徑

支持單文件

1. 添加單元 shellAPI

2. 在過程里 procedure TForm1.FormCreate(Sender: TObject);

加入此函數DragAcceptFiles(Form1.Handle,true); //注冊拖放文件

3. 在 public 里聲明
procedure TFfile(var Msg:TMessage);message WM_DROPFILES;

4.函數實現

procedure TForm1.TFfile(var Msg:TMessage);
var
buffer:array[0..1024] of Char;
begin
inherited;
buffer[0]:=#0;
DragQueryFile(Msg.WParam,0,buffer,sizeof(buffer)); //獲取拖入文件名稱
label1.Caption:=PChar(@buffer); //字符數組轉換成字符串
end;
View Code

支持多文件

首先先建立工程然后添加一個memo控件,用來存放路徑。
拖拽文件需要用到shellAPI所以,在單元里面需要添加shellAPI


好了我們來看實現過程


1. 添加單元 shellAPI

2. 在過程里 procedure TForm1.FormCreate(Sender: TObject);

加入此函數DragAcceptFiles(Form1.Handle,true); //注冊拖放文件

3. 在 public 里聲明
procedure TFfile(var Msg:TMessage);message WM_DROPFILES;

4.函數實現

procedure TForm1.TFfile(var Msg:TMessage);
var
FilesCount: Integer;// 文件總數
i: Integer;
buffer:array[0..1024] of Char;
begin
inherited;
try
buffer[0]:=#0;
FilesCount:=DragQueryFile(Msg.WParam, $FFFFFFFF,nil,0); //獲取文件個數
Memo1.Lines.Add('文件總數為:'+IntToStr(FilesCount));
// 獲取文件名
for i:=0 to FilesCount-1 do
begin
DragQueryFile(Msg.WParam, i, buffer,256); //獲取拖拽文件路徑
Memo1.Lines.Add(buffer);
end;
finally
DragFinish(Msg.WParam);
end;
end;
View Code

 

在DELPHI中如何得到一個文件名不帶擴展名

Edit4.Text:=paramstr(0);//C:\FILE\Project1.exe
    Edit2.Text:=ExtractFilePath(Application.ExeName);//C:\FILE\
    Edit1.Text:=ExtractFileName(Application.ExeName);//Project1.exe
   //project
    Edit3.Text:=ExtractFileExt(Application.ExeName);//.exe
Edit1.Text:=ChangeFileExt(ExtractFileName(Application.ExeName),'') ; //獲取到應用程序名后,將后綴名清空就可以啦。
View Code

生成臨時文件

//舉例:  
var  
  arr,f: array[0..MAX_PATH] of Char;  
  num: DWORD;  
begin  
  num := GetTempPath(MAX_PATH, arr);  
  ShowMessage(arr);           {C:\DOCUME~1\wy\LOCALS~1\Temp\}
  GetTempFileName(arr,'-My',16,f){C:\DOCUME~1\wy\LOCALS~1\Temp\-my10.temp}
  ShowMessage(IntToStr(num)); 
  ShowMessage(IntToStr(num)); {29}  
end;  
View Code

 


免責聲明!

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



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