2015-09-30 51 views
-1

的根目录我有执行Delphi应用程序和当我打电话GetCurrentDir以下回报:返回的Delphi可执行

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; 

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

+2

我想你需要定义你的意思是一个Delphi可执行文件的根目录。假设您将可执行文件复制到程序文件目录下的文件夹中,就像您安装它一样。什么是根目录。 FWIW,当前目录只是巧合地与可执行文件所在的目录相同。它不一定是。你的文本处理代码是非常不必要的。您可以将其全部删除并替换为标准函数调用。 –

+1

所以,你可以编写'ExtractFileDir(ParamStr(0))'来获取包含可执行文件的目录。并提升两个目录'ExtractFileDir(ExtractFileDir(ExtractFileDir(ParamStr(0))))''。但你为什么要加强两个目录?这似乎很奇怪。如果你想得到更好的帮助,那么你应该解释你将如何处理这些信息。 –

+0

大卫我相信我知道如何做这些事情。你的回答非常好。由于持续的火警,我没有时间进一步查看您的产品。文件解释你提到的事情在哪里?感谢Arch –

回答

2

还有另外一种方式:

ExpandFileName(GetCurrentDir + '\..\..\'); // Current folder 
ExpandFileName(ExtractFileDir(Application.ExeName) + '\..\..\'); // Exe folder 

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

将带你向上两级,你可以看到。

当然,这只能回答“如何获得2个等级”的问题。关于Exe根的问题是一种无意义的问题。你可能只需要配置您的项目设置为不使Win32\Debug文件夹或移动数据文件到有;-)

7

可以使用获得的完整路径的可执行应用程序:

ParamStr(0); 

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

Application.ExeName; 

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

这两者之间的区别是,ExtractFilePath retuns与最后定界符(/\)的路径和ExtractFileDir截断它。


David Heffernancomment,多次调用陈述ExtractFileDir允许得到父目录:

C:\dev\w32\2015\BCSLBDemo\Win32\Debug\Project1.exe您可以获得C:\dev\w32\2015\BCSLBDemo这样的:

ExtractFileDir(ExtractFileDir(ExtractFileDir(ParamStr(0)))); 
+0

你知道'Application.ExeName'是如何实现的吗?它是'ParamStr(0)'。那么为什么要区分呢? –

+0

@DavidHeffernan回答修改O :-) – fantaghirocco

+0

您是否阅读过这个问题的一部分,*我想要的是“C:\ dev \ w32 \ 2015 \ BCSLBDemo”*?您是否阅读过我的评论? –

0

可以使用获得到应用程序可执行文件的完整路径:

德尔福2010申报用途 SWSystem;

德尔福氙申报用途 IWSystem;

showmessage(gsAppPath);