最近、Javaでアプリケーションのディレクトリを取得する方法を検索しました。最終的に答えを見つけましたが、そのような一般的な用語を検索するのは簡単ではないので、驚くほど長い時間が必要でした。これを複数の言語で実現する方法のリストをまとめることは良い考えだと思います。
アイデアが気に入ったら(気に入らなければ)自由にアップ/ダウン投票してください。気に入ったら投稿してください.
実行可能ファイルを含むディレクトリと現在の作業ディレクトリ(Unixではpwd
で指定)。私はもともと前者に興味がありましたが、後者を決定する方法も自由に投稿できます(どちらを意味するかを明確にします)。
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
を使用してアプリケーションを起動します。
最初の2つの呼び出しは、「C:\ test\subdirectory」を返します。 3番目の呼び出しは「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
。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を渡して、現在のモジュールのパスを取得します。
Python
path = os.path.dirname(__file__)
現在のモジュールのパスを取得します。
Objective-C Cocoa(Mac OS X、iPhoneの特殊性については知りません):
NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
に 。ネット 使用できます
System.IO.Directory.GetCurrentDirectory
アプリケーションの現在の作業ディレクトリを取得するには、VB.NETでは特に使用できます
My.Application.Info.DirectoryPath
exeのディレクトリを取得します。
VB6では、 App.Path
プロパティを使用してアプリケーションパスを取得できます。
アプリケーションがドライブのルートにある場合、これには末尾の\
EXCEPTがないことに注意してください。
IDEで:
?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
Javaには、アプリケーションのパスを見つける2つの方法があります。 1つはSystem.getProperty
を使用することです:
System.getProperty("user.dir");
別の可能性は、Java.io.File
の使用です:
new Java.io.File("").getAbsolutePath();
さらに別の可能性はリフレクションを使用します:
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
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);
Delphi
Windowsアプリケーションの場合:
Unit Forms;
path := ExtractFilePath(Application.ExeName);
コンソールアプリケーションの場合:
言語に関係なく、最初のコマンドラインパラメーターは完全修飾された実行可能ファイル名です。
Unit System;
path := ExtractFilePath(ParamStr(0));
[〜#〜] 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).
?>
In Tcl
現在のスクリプトのパス:
set path [info script]
Tclシェルパス:
set path [info nameofexecutable]
これらのディレクトリが必要な場合は、次を実行します。
set dir [file dirname $path]
現在の(作業中の)ディレクトリを取得します。
set dir [pwd]
nix
UNIXでは、環境変数を使用して開始された実行可能ファイルへのパスを見つけることができます。 notは絶対パスである必要があるため、現在の作業ディレクトリ(シェル内のpwd
)および/またはPATH変数を0番目の値と組み合わせる必要があります。環境の要素。
ただし、Unixでは値は制限されています。実行可能ファイルは、たとえばシンボリックリンクを介して呼び出すことができ、環境変数には初期リンクのみが使用されます。一般に、Unix上のアプリケーションは、興味深いこと(リソースのロードなど)にこれを使用する場合、あまり堅牢ではありません。 UNIXでは、物事にハードコードされた場所を使用するのが一般的です。たとえば、/etc
リソースの場所が指定されています。
inAndroidその
getApplicationInfo().dataDir;
sDカードを取得するには、私は使用します
Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);
後者は特定の種類のファイル(オーディオ/映画など)を保存するために使用されます。 Environmentクラスにはこれらの文字列の定数があります。
基本的に、アプリを使用する場合はApplicationInfoクラスを使用し、環境クラスを使用するSDカード/外部ディレクトリのデータを使用する場合は何でも使用します。
ドキュメント: ApplicationInfo 、 環境
bashでは、「pwd」コマンドは現在の作業ディレクトリを返します。
に Ruby、次のスニペットは現在のソースファイルのパスを返します。
path = File.dirname(__FILE__)
私は https://github.com/gpakosz/whereami をリリースしました。これはCの問題を解決し、以下を提供します。
WindowsではGetModuleFileNameW
を使用し、Linuxでは/proc/self/maps
を解析し、MacおよびiOSではAndroidを解析し、_NSGetExecutablePath
またはdladdr
を使用します。
Cmd(Microsoftコマンドラインシェル)
%*でスクリプトの名前を取得できます(pwdに関連する場合があります)
スクリプトのディレクトリを取得します:
set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%
バグを見つけたら、それを見つけます。その後、修正またはコメントしてください。
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 [〜#〜]には、スクリプトのパスにアクセスするための2つの関数があります。
_getBaseTemplatePath()
getCurrentTemplatePath()
_
GetBaseTemplatePathを呼び出すと、「ベース」スクリプトのパス、つまりWebサーバーによって要求されたものが返されます。
getCurrentTemplatePathを呼び出すと、現在のスクリプトのパス、つまり現在実行中のスクリプトのパスが返されます。
両方のパスは絶対パスであり、スクリプトの完全なディレクトリとファイル名が含まれています。
ディレクトリーのみを判別するには、結果に対して関数getDirectoryFromPath( ... )
を使用します。
したがって、アプリケーションのディレクトリの場所を特定するには、次のようにします。
_<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />
_
_Application.cfc
_のonApplicationStart
イベント内
CFMLエンジンを実行しているアプリサーバーのあるパスを特定するには、cfexecuteを使用してシェルコマンドにアクセスできます。
Unix:
_<cfexecute name="pwd"/>
_
windowsの場合、テキスト_pwd.bat
_を含む_@cd
_を作成し、次に:
_<cfexecute name="C:\docume~1\myuser\pwd.bat"/>
_
(画面に出力するのではなく、variable
のcfexecute
属性を使用して値を保存します。)
「Mac OSXのみに関する上記20:OSX JAR BUNDLERを介してJAR実行可能ファイルが「アプリ」に変換される場合、getClass()。getProtectionDomain()。getCodeSource()。getLocation();は返されません。アプリの現在のディレクトリですが、アプリの内部ディレクトリ構造を応答に追加しますアプリのこの内部構造は/ theCurrentFolderWhereTheAppReside/Contents/Resources/Java/yourfileです
おそらくこれはJavaの小さなバグです。とにかく、1つまたは2つの方法を使用して正しい答えを取得する必要があります。別のフォルダーまたはデスクトップにあるショートカットを使用します。
カール
SoundPimp.com