获取应用程序的路径


79

最近,我搜索了如何在Java中获取应用程序的目录。我终于找到了答案,但是我需要很长的时间,因为搜索这样一个通用术语并不容易。我认为最好用多种语言来汇编如何实现此目的的列表。

如果您(不喜欢)这个主意,可以随意上/下投票,如果您喜欢,请贡献力量

澄清:

包含可执行文件目录当前工作目录pwd在Unix下,由给定)之间有很好的区别。我最初对前者感兴趣,但也可以随意发布确定后者的方法(阐明您的意思)。


3
你是什​​么意思 当前的工作目录,或可执行代码所在的目录?
Paul de Vrieze

Answers:


59

Java中,调用

System.getProperty("user.dir")

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

返回当前工作目录。

致电

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

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

例:

  1. 您的应用程序位于

     C:\MyJar.jar
    
  2. 打开外壳程序(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()完美地工作,谢谢!
模糊分析

@fuzzyanalysis就是这样Class.getResource()
user207421 '16

22

.NET(C#,VB,…)中,您可以查询当前Assembly实例的实例Location。但是,此文件附加了可执行文件的文件名。以下代码清除了路径(using System.IOusing 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 2012年


7

蟒蛇

path = os.path.dirname(__file__)

那得到了当前模块的路径。


5

Objective-C可可(Mac OS X,我不知道iPhone的特性):

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

2
在我的Mac OSX应用程序中,我正在寻找可执行文件的实际路径(用于包含在plist中),并使用了该路径:-还有一个“ 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 2011年

@lepe不要在启动时设置工作目录,这会产生一些不良后果,例如默认情况下将某些文件选择器对话框指向应用程序的路径,而不是用户选择的工作目录。
康拉德·鲁道夫

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属性获取应用程序路径。

请注意,\当应用程序位于驱动器的根目录中时,它将没有尾随EXCEPT。

在IDE中:

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98

4

.Net中,您可以使用

System.IO.Directory.GetCurrentDirectory

获取应用程序的当前工作目录,特别是在VB.NET中,您可以使用

My.Application.Info.DirectoryPath

获取exe目录。


3

德尔菲

在Windows应用程序中:

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

在控制台应用程序中:

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

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

3


* nix类型环境中的Libc(在Windows中也为Cygwin):

  #include <unistd.h>

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

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

   char *get_current_dir_name(void);

参见手册页


2

的Unix

在Unix中,可以找到使用环境变量启动的可执行文件的路径。这是不是一定是绝对路径,那么你就需要结合当前的工作目录(在shell: pwd)与环境的第0元素的值和/或PATH变量。

不过,该值在Unix中受到限制,因为可执行文件可以通过符号链接进行调用,而环境变量仅使用初始链接。通常,如果将UNIX上的应用程序用于任何有趣的事情(例如加载资源),它们的鲁棒性都不强。在Unix上,通常使用硬编码的位置进行操作,例如在/etc其中指定资源位置的配置文件。



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).
?>

2

Android的

getApplicationInfo().dataDir;

要获取SD卡,我使用

Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);

后者用于存储特定类型的文件(音频/电影等)。您在Environment类中具有这些字符串的常量。

基本上,对于与应用程序相关的任何事情,请使用ApplicationInfo类;对于与SD卡/外部目录中的数据相关的任何事情,请使用Environment类。

Docs: ApplicationInfo环境


2

Tcl中

当前脚本的路径:

set path [info script]

Tcl shell路径:

set path [info nameofexecutable]

如果您需要任何这些目录,请执行以下操作:

set dir [file dirname $path]

获取当前(工作)目录:

set dir [pwd]

2

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;
}

如果应用程序在JAR文件中运行,则会抛出NPE。
user207421 '16

1

Ruby中,以下代码段返回当前源文件的路径:

path = File.dirname(__FILE__)

1

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来存储值,而不是输出到屏幕。)


1

在cmd(Microsoft命令行shell)中

您可以使用%*获取脚本的名称(可能相对于pwd)

这将获取脚本目录:

set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%

如果发现任何错误,您将找到。然后,请修复或发表评论。



0

请注意回答“仅适用于Mac OSX的上述20:如果通过OSX JAR BUNDLER将JAR可执行文件转换为“应用程序”,则getClass()。getProtectionDomain()。getCodeSource()。getLocation();不会返回应用的当前目录,但会将应用的内部目录结构添加到响应中。应用的此内部结构为/ theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile

也许这是Java中的一个小错误。无论如何,一个人必须使用一种或两种方法来获得正确的答案,并且即使应用程序已启动(例如通过位于不同文件夹或桌面上的快捷方式),两者都将提供正确的答案。

卡尔

SoundPimp.com

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.