我最近搜索过如何用Java获取应用程序的目录。我终于找到了答案,但我需要很长时间才能找到这样一个通用术语并不容易。我认为编制一份如何用多种语言实现这一目标的清单是个好主意。
如果您(不)喜欢这个想法,请随意上/下投票,如果您喜欢,请请提供。
包含可执行文件的目录和当前工作目录(在Unix下由pwd
给出)之间有一个很好的区别。我最初对前者很感兴趣,但也可以随意发布确定后者的方法(澄清你的意思)。
答案 0 :(得分:58)
在 Java 中进行调用
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 \子目录。
使用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
答案 1 :(得分:22)
在 .NET(C#,VB,...)中,您可以查询当前Assembly
实例的Location
。但是,这会附加可执行文件的名称。以下代码清理路径(using System.IO
和using System.Reflection
):
Directory.GetParent(Assembly.GetExecutingAssembly().Location)
或者,您可以使用AppDomain
提供的信息来搜索引用的程序集:
System.AppDomain.CurrentDomain.BaseDirectory
VB允许通过My
命名空间的另一个快捷方式:
My.Application.Info.DirectoryPath
答案 2 :(得分:9)
在 Windows 中,使用WinAPI函数GetModuleFileName()。为模块句柄传递NULL以获取当前模块的路径。
答案 3 :(得分:7)
<强>的Python 强>
path = os.path.dirname(__file__)
获取当前模块的路径。
答案 4 :(得分:5)
Objective-C Cocoa (Mac OS X,我不知道iPhone的具体情况):
NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
答案 5 :(得分:4)
在VB6中,您可以使用App.Path
属性获取应用程序路径。
请注意,当应用程序位于驱动器的根目录中时,这不会有\
EXCEPT。
在IDE中:
?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
答案 6 :(得分:4)
在 .Net 中,您可以使用
System.IO.Directory.GetCurrentDirectory
获取应用程序的当前工作目录,并在VB.NET中具体使用
My.Application.Info.DirectoryPath
获取exe的目录。
答案 7 :(得分:4)
在 Java 中,有两种方法可以找到应用程序的路径。一个是使用System.getProperty
:
System.getProperty("user.dir");
另一种可能性是使用java.io.File
:
new java.io.File("").getAbsolutePath();
另一种可能性使用反思:
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
答案 8 :(得分:3)
<强>的Delphi 强>
在Windows应用程序中:
Unit Forms;
path := ExtractFilePath(Application.ExeName);
在控制台应用程序中:
与语言无关,第一个命令行参数是完全限定的可执行文件名:
Unit System;
path := ExtractFilePath(ParamStr(0));
答案 9 :(得分: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);
答案 10 :(得分:2)
<强>的Unix 强>
在unix中,可以找到使用环境变量启动的可执行文件的路径。 不必然是绝对路径,因此您需要将当前工作目录(在shell中:pwd
)和/或PATH变量与第0个元素的值组合在一起环境。
该值在unix中受到限制,因为可执行文件可以通过符号链接调用,并且只有初始链接用于环境变量。一般来说,如果将unix用于任何有趣的事情(例如加载资源),unix上的应用程序就不是很强大了。在unix上,通常使用硬编码的位置,例如/etc
中指定资源位置的配置文件。
答案 11 :(得分:2)
在 Tcl
中当前脚本的路径:
set path [info script]
Tcl shell路径:
set path [info nameofexecutable]
如果您需要任何这些目录,请执行:
set dir [file dirname $path]
获取当前(工作)目录:
set dir [pwd]
答案 12 :(得分:2)
在 PHP :
中<?php
echo __DIR__; //same as dirname(__FILE__). will return the directory of the running script
echo $_SERVER["DOCUMENT_ROOT"]; // will return the document root directory under which the current script is executing, as defined in the server's configuration file.
echo getcwd(); //will return the current working directory (it may differ from the current script location).
?>
答案 13 :(得分:2)
在 Android 中
getApplicationInfo().dataDir;
获取SD卡,我使用
Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);
其中后者用于存储特定类型的文件(音频/电影等)。您在Environment类中有这些字符串的常量。
基本上,对于应用程序使用ApplicationInfo类以及与使用Environment类的SD卡/外部目录中的数据有关的任何内容。
答案 14 :(得分:2)
在 bash 中,'pwd'命令返回当前工作目录。
答案 15 :(得分:1)
在 CFML 中,有两个用于访问脚本路径的函数:
getBaseTemplatePath()
getCurrentTemplatePath()
调用getBaseTemplatePath将返回“base”脚本的路径 - 即Web服务器请求的脚本。
调用getCurrentTemplatePath将返回当前脚本的路径 - 即当前正在执行的脚本。
两个路径都是绝对路径,包含脚本的完整目录+文件名。
要确定目录,请在结果上使用函数getDirectoryFromPath( ... )
。
因此,要确定应用程序的目录位置,您可以执行以下操作:
<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />
onApplicationStart
Application.cfc
事件内部
要确定运行CFML引擎的应用服务器所在的路径,您可以使用cfexecute访问shell命令,因此(请记住上面关于pwd / etc的讨论),您可以这样做:
Unix的:
<cfexecute name="pwd"/>
对于Windows,请创建包含文本pwd.bat
的{{1}},然后:
@cd
(使用<cfexecute name="C:\docume~1\myuser\pwd.bat"/>
的{{1}}属性存储值,而不是输出到屏幕。)
答案 16 :(得分:1)
,以下代码段返回当前源文件的路径:
path = File.dirname(__FILE__)
答案 17 :(得分:1)
在cmd(Microsoft命令行shell)
中您可以使用%*获取脚本的名称(可能与pwd相关)
这将获取脚本目录:
set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%
如果你发现任何错误,你会发现。那么请修改或评论。
答案 18 :(得分:1)
我发布了https://github.com/gpakosz/whereami,解决了C语言中的问题并为您提供:
它在Windows上使用GetModuleFileNameW
,在Linux和Android上解析/proc/self/maps
,在Mac和iOS上使用_NSGetExecutablePath
或dladdr
。
答案 19 :(得分:1)
<强>爪哇:强>
在所有系统(Windows,Linux,Mac OS X)上只对我有用:
public static File getApplicationDir()
{
URL url = ClassLoader.getSystemClassLoader().getResource(".");
File applicationDir = null;
try {
applicationDir = new File(url.toURI());
} catch(URISyntaxException e) {
applicationDir = new File(url.getPath());
}
return applicationDir;
}
答案 20 :(得分:0)
注意回答“上面关于Mac OSX的20以上:如果通过OSX JAR BUNDLER将JAR可执行文件转换为”app“,那么getClass()。getProtectionDomain()。getCodeSource()。getLocation();将不返回应用程序的当前目录,但会将应用程序的内部目录结构添加到响应中。应用程序的内部结构是/ theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile
也许这是Java中的一个小错误。无论如何,必须使用方法一或两个来获得正确的答案,即使应用程序已启动,两者都将提供正确的答案,例如通过位于不同文件夹或桌面上的快捷方式。
卡尔
SoundPimp.com