最近,我搜索了如何在Java中获取应用程序的目录。我终于找到了答案,但是我需要很长的时间,因为搜索这样一个通用术语并不容易。我认为最好用多种语言来汇编如何实现此目的的列表。
如果您(不喜欢)这个主意,可以随意上/下投票,如果您喜欢,请贡献力量。
澄清:
在包含可执行文件的目录和当前工作目录(pwd
在Unix下,由给定)之间有很好的区别。我最初对前者感兴趣,但也可以随意发布确定后者的方法(阐明您的意思)。
最近,我搜索了如何在Java中获取应用程序的目录。我终于找到了答案,但是我需要很长的时间,因为搜索这样一个通用术语并不容易。我认为最好用多种语言来汇编如何实现此目的的列表。
如果您(不喜欢)这个主意,可以随意上/下投票,如果您喜欢,请贡献力量。
在包含可执行文件的目录和当前工作目录(pwd
在Unix下,由给定)之间有很好的区别。我最初对前者感兴趣,但也可以随意发布确定后者的方法(阐明您的意思)。
Answers:
在Java中,调用
System.getProperty("user.dir")
和
new java.io.File(".").getAbsolutePath();
返回当前工作目录。
致电
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
返回包含当前类的JAR文件的路径,如果直接从文件系统运行,则返回产生当前类的CLASSPATH元素(路径)。
例:
您的应用程序位于
C:\MyJar.jar
打开外壳程序(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()
。
在.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
在Windows中,使用WinAPI函数GetModuleFileName()。为模块句柄传递NULL以获取当前模块的路径。
在Java中,有两种方法可以找到应用程序的路径。一种是雇用System.getProperty
:
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())
。
在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).
?>
在Android的其
getApplicationInfo().dataDir;
要获取SD卡,我使用
Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);
后者用于存储特定类型的文件(音频/电影等)。您在Environment类中具有这些字符串的常量。
基本上,对于与应用程序相关的任何事情,请使用ApplicationInfo类;对于与SD卡/外部目录中的数据相关的任何事情,请使用Environment类。
Docs: ApplicationInfo, 环境
在Tcl中
当前脚本的路径:
set path [info script]
Tcl shell路径:
set path [info nameofexecutable]
如果您需要任何这些目录,请执行以下操作:
set dir [file dirname $path]
获取当前(工作)目录:
set dir [pwd]
Java:
在所有系统(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;
}
在CFML中,有两个用于访问脚本路径的函数:
getBaseTemplatePath()
getCurrentTemplatePath()
调用getBaseTemplatePath返回“基本”脚本的路径-即Web服务器请求的脚本的路径。
调用getCurrentTemplatePath返回当前脚本的路径-即当前正在执行的脚本的路径。
这两个路径都是绝对路径,并包含脚本的完整目录和文件名。
要仅确定目录,请getDirectoryFromPath( ... )
对结果使用函数。
因此,要确定应用程序的目录位置,可以执行以下操作:
<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />
onApplicationStart
为您准备的活动Application.cfc
要确定运行CFML引擎的应用服务器所在的路径,可以使用cfexecute访问shell命令,因此(请注意上面关于pwd / etc的讨论)可以:
Unix:
<cfexecute name="pwd"/>
对于Windows,创建一个pwd.bat
包含文本@cd
,然后:
<cfexecute name="C:\docume~1\myuser\pwd.bat"/>
(使用variable
属性cfexecute
来存储值,而不是输出到屏幕。)
在cmd(Microsoft命令行shell)中
您可以使用%*获取脚本的名称(可能相对于pwd)
这将获取脚本目录:
set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%
如果发现任何错误,您将找到。然后,请修复或发表评论。
我发布了https://github.com/gpakosz/whereami,它解决了C语言中的问题并为您提供:
它使用GetModuleFileNameW
在Windows上,解析/proc/self/maps
在Linux和Android应用_NSGetExecutablePath
或dladdr
在Mac和iOS。
请注意回答“仅适用于Mac OSX的上述20:如果通过OSX JAR BUNDLER将JAR可执行文件转换为“应用程序”,则getClass()。getProtectionDomain()。getCodeSource()。getLocation();不会返回应用的当前目录,但会将应用的内部目录结构添加到响应中。应用的此内部结构为/ theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile
也许这是Java中的一个小错误。无论如何,一个人必须使用一种或两种方法来获得正确的答案,并且即使应用程序已启动(例如通过位于不同文件夹或桌面上的快捷方式),两者都将提供正确的答案。
卡尔
SoundPimp.com