zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)
    LeetCode 21. Merge Two Sorted Lists (合并两个有序链表)
    LeetCode 720. Longest Word in Dictionary (字典里最长的单词)
    LeetCode 690. Employee Importance (职员的重要值)
    LeetCode 645. Set Mismatch (集合不匹配)
    LeetCode 500. Keyboard Row (键盘行)
    LeetCode 463. Island Perimeter (岛的周长)
    115.Distinct Subsequences
    55.Jump Game
    124.Binary Tree Maximum Path Sum
  • 原文地址:https://www.cnblogs.com/blogpro/p/11344041.html
Copyright © 2011-2022 走看看