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 Settingswy}
%HOMEPATH% {当前用户路径 - Documents and Settingswy}
%TMP% {当前用户临时文件夹 - C:DOCUME~1wyLOCALS~1Temp}
%TEMP% {当前用户临时文件夹 - C:DOCUME~1wyLOCALS~1Temp}
%APPDATA% {当前用户数据文件夹 - C:Documents and SettingswyApplication Data}
%PROGRAMFILES% {程序默认安装目录 - C:Program Files}
%COMMONPROGRAMFILES% {文件通用目录 - C:Program FilesCommon Files}
%USERNAME% {当前用户名 - wy}
%ALLUSERSPROFILE% {所有用户文件目录 - C:Documents and SettingsAll 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:WINDOWSsystem32cmd.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~1wyLOCALS~1Temp}  
  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:FILEProject1.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)+'newFile123.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 SettingswyMy DocumentsRAD StudioProjectsProject1.exe

  //路径
  s := ExtractFilePath(ss);
  ShowMessage(s); //C:Documents and SettingswyMy DocumentsRAD StudioProjects

  //所在文件夹
  s := ExtractFileDir(ss);
  ShowMessage(s); //C:Documents and SettingswyMy DocumentsRAD StudioProjects

  //所在逻辑盘
  s := ExtractFileDrive(ss);
  ShowMessage(s); //C:

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

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

  //相对路径
  s := ExtractRelativePath('C:Documents and SettingswyMy Documents',ss);
  ShowMessage(s); //RAD StudioProjectsProject1.exe

  //dos下的短文件名
  s := ExtractShortPathName(ss);
  ShowMessage(s); //C:DOCUME~1wyMYDOCU~1RADSTU~1ProjectsProject1.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 SettingswyMy DocumentsRAD StudioProjectsProject1.exe

  //去掉结尾的路径分隔符
  s := ExcludeTrailingPathDelimiter(ExtractFilePath(ss));
  ShowMessage(s); //C:Documents and SettingswyMy DocumentsRAD StudioProjects

  //去掉结尾的路径分隔符, 只是调用:ExcludeTrailingPathDelimiter
  s := ExcludeTrailingBackslash(ExtractFilePath(ss));
  ShowMessage(s); //C:Documents and SettingswyMy DocumentsRAD StudioProjects

  //更换扩展名, 并不修改文件, 只是替换字符串:
  s := ChangeFileExt(ss,'.bak');
  ShowMessage(s); //C:Documents and SettingswyMy DocumentsRAD StudioProjectsProject1.bak

  //更换文件路径:
  s := ChangeFilePath(ss,'c:	emp');
  ShowMessage(s); //c:	empProject1.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 SettingswyMy DocumentsRAD StudioProjectsProject1.exe
  ProcessPath(s,d,p,f);
  ShowMessage(d); //C
  ShowMessage(p); //Documents and SettingswyMy DocumentsRAD StudioProjects
  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_Fileshellopencommand', true);
    //设置关联程序(注意:%1加上双引号,可以解决文件路径中含空格的问题)
    WriteString('',strExeFileName + ' "%1"');
    //关闭键
    CloseKey;
    //打开默认图标键
    OpenKey(strFileExtension + '_Auto_Filedefaulticon',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:FILEProject1.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~1wyLOCALS~1Temp}
  GetTempFileName(arr,'-My',16,f){C:DOCUME~1wyLOCALS~1Temp-my10.temp}
  ShowMessage(IntToStr(num)); 
  ShowMessage(IntToStr(num)); {29}  
end;  
View Code
原文地址:https://www.cnblogs.com/blogpro/p/11344041.html