我最近在搜索如何在Java中获取应用程序目录。虽然最终找到了答案,但是因为这是一个很普遍的术语,所以需要花费非常长的时间进行搜索。我认为将如何在多种编程语言中实现此功能的清单编译在一起是个好主意。
如果您喜欢这个想法,请随意点赞/点踩,并请贡献您的方法。
澄清:
“包含可执行文件的目录”和“当前工作目录”(在Unix下由pwd
给出)之间有细微差别。我最初对前者感兴趣,但是如果您愿意,可以发帖介绍确定后者的方法(并澄清您所指的是哪个目录)。
我最近在搜索如何在Java中获取应用程序目录。虽然最终找到了答案,但是因为这是一个很普遍的术语,所以需要花费非常长的时间进行搜索。我认为将如何在多种编程语言中实现此功能的清单编译在一起是个好主意。
如果您喜欢这个想法,请随意点赞/点踩,并请贡献您的方法。
“包含可执行文件的目录”和“当前工作目录”(在Unix下由pwd
给出)之间有细微差别。我最初对前者感兴趣,但是如果您愿意,可以发帖介绍确定后者的方法(并澄清您所指的是哪个目录)。
System.getProperty("user.dir")
并且
new java.io.File(".").getAbsolutePath();
返回当前工作目录。
调用
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
返回包含当前类的JAR文件路径,或者如果您直接从文件系统运行,则返回产生当前类的CLASSPATH元素(路径)。
示例:
您的应用程序位于
C:\MyJar.jar
打开 shell(cmd.exe)并 cd
到 C:\test\subdirectory。
使用命令 java -jar C:\MyJar.jar
启动应用程序。
前两个调用返回“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
Class.getResource()
的用途。 - user207421Directory.GetParent(Assembly.GetExecutingAssembly().Location)
或者,您可以使用AppDomain
提供的信息来搜索引用的程序集:
System.AppDomain.CurrentDomain.BaseDirectory
VB允许通过My
命名空间使用另一种快捷方式:
My.Application.Info.DirectoryPath
Python
path = os.path.dirname(__file__)
这将获取当前模块的路径。
Objective-C Cocoa(仅限于Mac OS X,我不确定iPhone的具体情况):
NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
System.getProperty("user.dir");
java.io.File
:new java.io.File("").getAbsolutePath();
另一种可能性是使用反射:
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
C:\Program Files\ExampleApp
以URL形式表示为file:/C:/Program%20Files/ExampleApp
,getPath()返回"/C:/Program%20Files/ExampleApp"
,显然不存在。将URL转换为文件的唯一正确方法是new File(url.toURI())
。 - VGRApp.Path
属性获取应用程序路径。\
。?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
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);
Delphi
在Windows应用程序中:
Unit Forms;
path := ExtractFilePath(Application.ExeName);
在控制台应用程序中:
与语言无关,第一个命令行参数是完全限定的可执行文件名:
Unit System;
path := ExtractFilePath(ParamStr(0));