返回Delphi可执行文件的根目录

Arc*_*oks 2 delphi directory root delphi-xe8

我有一个Delphi应用程序正在执行,当我调用GetCurrentDir以下返回时:

C:\ dev的\ W32\2015年\ BCSLBDemo\WIN32 \调试

当我打电话时,ExtractFileDir(GetCurrentDir())我收到以下内容:

C:\ dev的\ W32\2015年\ BCSLBDemo\WIN32

我想要的是什么 C:\dev\w32\2015\BCSLBDemo

function RetRoot: string;
var
  i: Integer;
  buf: string;
begin
  Result := '';
  buf := ExtractFileDir(GetCurrentDir());
  i := Length(buf);
  repeat
    dec(i);
  until (buf[i] = '\') or (i < 3);
  if buf[i] = '\' then
  begin
    Delete(buf, i, Length(buf));
    Result := buf;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我写了这个函数来得到想要的结果.我想知道是否有更好的方法来完成检索Delphi可执行文件的根目录.

fan*_*cco 9

您可以使用以下命令获取应用程序可执行文件的完整路

ParamStr(0);
Run Code Online (Sandbox Code Playgroud)

对于基于表单的应用程序,您还有Application可用的对象:

Application.ExeName;
Run Code Online (Sandbox Code Playgroud)

要获取没有文件名的文件路径,可以考虑使用ExtractFileDirExtractFilePath.

两者之间的区别在于ExtractFilePath使用最后一个分隔符(/\)返回路径并ExtractFileDir截断它.


正如David Heffernan评论中所述,多次调用ExtractFileDir允许获取父目录:

C:\dev\w32\2015\BCSLBDemo\Win32\Debug\Project1.exe,你可以得到C:\dev\w32\2015\BCSLBDemo这样的:

ExtractFileDir(ExtractFileDir(ExtractFileDir(ParamStr(0))));
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:Application.ExeName 目前仅存在于 VCL 应用程序中。 (2认同)

Kro*_*ica 7

还有另一种方式:

ExpandFileName(GetCurrentDir + '\..\..\'); // Current folder
ExpandFileName(ExtractFileDir(Application.ExeName) + '\..\..\'); // Exe folder
Run Code Online (Sandbox Code Playgroud)

C:\ dev的\ W32\2015年\ BCSLBDemo

如你所见,你会带两个级别.

当然这只回答了"如何获得2级"问题.关于Exe root的问题有点无意义.您可能只需要将项目设置配置为不创建Win32\Debug文件夹或将数据文件移动到那里;-)