it-swarm.dev

获取应用程序的路径

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

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

澄清:

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

79
Konrad Rudolph

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'。

从文件系统而不是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
58
Thomas Feilkas

.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
22
Konrad Rudolph

Windows 中,使用WinAPI函数 GetModuleFileName() 。为模块句柄传递NULL以获取当前模块的路径。

9
MrZebra

Python

path = os.path.dirname(__file__)

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

7
Alex McBride

Objective-C Cocoa (Mac OS X,我不知道iPhone的具体情况):

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

在 。净 您可以使用

System.IO.Directory.GetCurrentDirectory

获取应用程序的当前工作目录,并在VB.NET中具体使用

My.Application.Info.DirectoryPath

获取exe的目录。

4
d7samurai

在VB6中,您可以使用 App.Path property获取应用程序路径。

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

在IDE中:

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

Java 中,有两种方法可以找到应用程序的路径。一个是使用System.getProperty

System.getProperty("user.dir");

另一种可能性是使用Java.io.File

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

另一种可能性使用反射:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
4
Konrad Rudolph

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

参见手册页

3
Rajish

德尔福

在Windows应用程序中:

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

在控制台应用中:

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

Unit System;
path := ExtractFilePath(ParamStr(0));
3
Ralph M. Rickenbach

_ 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
lepe

Tcl

当前脚本的路径:

set path [info script]

Tcl Shell路径:

set path [info nameofexecutable]

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

set dir [file dirname $path]

获取当前(工作)目录:

set dir [pwd]
2
Cristi Diaconescu

Unix

在unix中,可以找到使用环境变量启动的可执行文件的路径。它是 not 必然是绝对路径,因此您需要将当前工作目录(在Shell:pwd中)和/或PATH变量与环境的第0个元素的值组合在一起。

该值在unix中受到限制,因为可执行文件可以例如通过符号链接调用,并且只有初始链接用于环境变量。一般来说,如果将unix用于任何有趣的事情(例如加载资源),unix上的应用程序就不是很强大了。在unix上,通常使用硬编码位置,例如/etc中指定资源位置的配置文件。

2
Paul de Vrieze

Android

getApplicationInfo().dataDir;

拿到SD卡,我用

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

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

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

文档: ApplicationInfo环境

2
rishi

bash 中,'pwd'命令返回当前工作目录。

2
Cedric Meury

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

path = File.dirname(__FILE__)
1
bltxd

我发布了 https://github.com/gpakosz/whereami 它解决了C中的问题,并为您提供:

  • 当前可执行文件的路径
  • 当前模块的路径(与从共享库调用时的可执行路径不同)。

它在Windows上使用GetModuleFileNameW,在Linux和Android上解析/proc/self/maps并在Mac和iOS上使用_NSGetExecutablePathdladdr

1
Gregory Pakosz

在cmd(Microsoft命令行Shell)

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

这获取脚本目录:

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

如果你发现任何错误,你会发现。那么请修复或评论。

1
ctrl-alt-delor

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

_ cfml _ 中有两个用于访问脚本路径的函数:

getBaseTemplatePath()
getCurrentTemplatePath()

调用getBaseTemplatePath将返回“base”脚本的路径 - 即Web服务器请求的脚本。
调用getCurrentTemplatePath返回当前脚本的路径 - 即当前正在执行的路径。

两个路径都是绝对路径,包含脚本的完整目录+文件名。

要仅确定目录,请在结果上使用函数getDirectoryFromPath( ... )

因此,要确定应用程序的目录位置,您可以执行以下操作:

<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />

Application.cfconApplicationStart事件中



要确定运行CFML引擎的应用服务器所在的路径,可以使用cfexecute访问Shell命令,因此(请记住上面关于pwd/etc的讨论),您可以这样做:

Unix的:

<cfexecute name="pwd"/>

对于Windows,创建包含文本pwd.bat@cd,然后:

<cfexecute name="C:\docume~1\myuser\pwd.bat"/>

(使用variablecfexecute属性来存储值,而不是输出到屏幕。)

1
Peter Boughton

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

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

卡尔

SoundPimp.com

0
carl