• 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
  • 相关阅读:
    Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
    xss跨站脚本和csrf 跨站请求伪造
    随机32位字符
    Demura说明
    Demura介绍
    C# 调用c++编译dll
    数据结构之-数组
    C# 深克隆和浅克隆
    弹性盒子的知识点
    行为型设计模式之-观察者模式
  • 原文地址:https://www.cnblogs.com/blogpro/p/11344041.html
Copyright © 2020-2023  润新知