获取应用程序的路径

时间:2008-10-20 11:07:35

标签: language-agnostic path

我最近搜索过如何用Java获取应用程序的目录。我终于找到了答案,但我需要很长时间才能找到这样一个通用术语并不容易。我认为编制一份如何用多种语言实现这一目标的清单是个好主意。

如果您(不)喜欢这个想法,请随意上/下投票,如果您喜欢,请请提供

澄清:

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

21 个答案:

答案 0 :(得分:58)

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 \子目录。

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

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

  5. 从文件系统而不是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.IOusing 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);

See man page

答案 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卡/外部目录中的数据有关的任何内容。

文件: ApplicationInfoEnvironment

答案 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)

Ruby 中的

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

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上使用_NSGetExecutablePathdladdr

答案 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