获取应用程序路径

80

我最近在搜索如何在Java中获取应用程序目录。虽然最终找到了答案,但是因为这是一个很普遍的术语,所以需要花费非常长的时间进行搜索。我认为将如何在多种编程语言中实现此功能的清单编译在一起是个好主意。

如果您喜欢这个想法,请随意点赞/点踩,并请贡献您的方法。

澄清:

“包含可执行文件的目录”和“当前工作目录”(在Unix下由pwd给出)之间有细微差别。我最初对前者感兴趣,但是如果您愿意,可以发帖介绍确定后者的方法(并澄清您所指的是哪个目录)。


3
你所指的路径是哪一个?是当前工作目录,还是可执行代码所在的目录? - Paul de Vrieze
21个回答

59
在Java中,调用
System.getProperty("user.dir")

并且

new java.io.File(".").getAbsolutePath();

返回当前工作目录。

调用

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

返回包含当前类的JAR文件路径,或者如果您直接从文件系统运行,则返回产生当前类的CLASSPATH元素(路径)。

示例:

  1. 您的应用程序位于

    C:\MyJar.jar
    
  2. 打开 shell(cmd.exe)并 cd 到 C:\test\subdirectory。

  3. 使用命令 java -jar C:\MyJar.jar 启动应用程序。

  4. 前两个调用返回“C:\test\subdirectory”;第三个调用返回“C:\MyJar.jar”。

当从文件系统而不是JAR文件运行时,结果将是生成的类文件根目录的路径,例如

c:\eclipse\workspaces\YourProject\bin\

路径不包括生成的类文件的包目录。

一个完整的示例,用于获取应用程序目录而不包括.jar文件名称,或者在直接从文件系统运行时(例如调试时)获取到类文件的相应路径:

String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

if (applicationDir.endsWith(".jar"))
{
    applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer

一直在寻找一种方法将只读文件放入与Java类相同的包中...getClass().getProtectionDomain().getCodeSource().getLocation().getPath()完美地解决了问题,谢谢! - Fuzzy Analysis
@fuzzyanalysis 这正是 Class.getResource() 的用途。 - user207421

22
在.NET (C#, VB, ...)中,你可以查询当前Assembly实例的Location。然而,这里会附加可执行文件的文件名。以下代码对路径进行了清理(使用了System.IO和System.Reflection):
Directory.GetParent(Assembly.GetExecutingAssembly().Location)

或者,您可以使用AppDomain提供的信息来搜索引用的程序集:

System.AppDomain.CurrentDomain.BaseDirectory

VB允许通过My命名空间使用另一种快捷方式:

My.Application.Info.DirectoryPath

1
对于一些程序,你也可以使用Application.StartupPath。但是对于ASP.NET来说,这个方法不起作用。 - jocull
1
实际上,它是 Application.ExecutablePath。 - zam664

9
在Windows中,使用WinAPI函数GetModuleFileName()。传入NULL作为模块句柄以获取当前模块的路径。

7

Python

path = os.path.dirname(__file__)

这将获取当前模块的路径。


5

Objective-C Cocoa(仅限于Mac OS X,我不确定iPhone的具体情况):

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];

2
在我的Mac OSX应用程序中,我正在寻找可执行文件的实际路径(用于包含在plist中),并使用了以下代码:NSString *executablePath = [[NSBundle mainBundle] executablePath]; - 还有一个'executableURL'版本可以返回URL而不是字符串。 - Todd

4
在Java中,有两种方法可以找到应用程序的路径。其中一种是使用System.getProperty:
System.getProperty("user.dir");

另一种可能性是使用java.io.File
new java.io.File("").getAbsolutePath();

另一种可能性是使用反射:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

1
请注意,这有点误导/混淆。您引用的三种方法可能会给出完全不同的结果! - Zarkonnen
Zarkonnen:你说得对,但正如我在原帖中所暗示的那样,我不是专家。这是一个社区维基。请随意编辑/纠正我的回答! - Konrad Rudolph
提示:通常情况下,如果您想访问当前工作目录中的文件,例如:file = new File("file.cfg"),则不需要指定路径。但请确保在初始化或应用程序快捷方式时始终将工作目录设置为应用程序位置。 - lepe
@lepe 不要在启动时设置工作目录,这会产生一些不良后果,例如默认指向某些文件选择对话框到应用程序路径,而不是用户选择的工作目录。 - Konrad Rudolph
1
上一种方法存在两个主要问题:一是ProtectionDomain.getCodeSource()可能返回null。二是,URL.getPath()不会返回文件名,它只返回URL的路径部分(可能已转义)。C:\Program Files\ExampleApp以URL形式表示为file:/C:/Program%20Files/ExampleApp,getPath()返回"/C:/Program%20Files/ExampleApp",显然不存在。将URL转换为文件的唯一正确方法是new File(url.toURI()) - VGR

4
在VB6中,您可以使用App.Path属性获取应用程序路径。
请注意,当应用程序位于驱动器根目录时,此属性将不会有尾随的\
在IDE中:
?App.Path
C:\Program Files\Microsoft Visual Studio\VB98

4
在 .Net 中,你可以使用 System.IO.Directory.GetCurrentDirectory 来获取应用程序的当前工作目录,在 VB.NET 中,你可以使用 My.Application.Info.DirectoryPath 来获取 exe 文件所在的目录。

3

Libc
在*nix类型的环境中(包括Windows上的Cygwin):

  #include <unistd.h>

   char *getcwd(char *buf, size_t size);

   char *getwd(char *buf); //deprecated

   char *get_current_dir_name(void);

See man page


3

Delphi

在Windows应用程序中:

Unit Forms;
path := ExtractFilePath(Application.ExeName);

在控制台应用程序中:

与语言无关,第一个命令行参数是完全限定的可执行文件名:

Unit System;
path := ExtractFilePath(ParamStr(0));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接