J'ai récemment cherché comment obtenir le répertoire de l'application en Java. J'ai finalement trouvé la réponse, mais j'ai eu besoin d'un temps étonnamment long, car la recherche d'un terme aussi générique n'est pas facile. Je pense que ce serait une bonne idée de compiler une liste de la manière de réaliser cela dans plusieurs langues.
Ne hésitez pas à up/downvote si vous n'aimez pas l'idée et s'il vous plaît contribuer si vous l'aimez.
Il existe une distinction fine entre le répertoire qui contient le fichier exécutable et le répertoire de travail actuel (donné par pwd
sous Unix). À l’origine, j’étais intéressé par le premier, mais n'hésitez pas à publier des méthodes pour déterminer le dernier (en précisant ce que vous voulez dire).
En Java les appels
System.getProperty("user.dir")
et
new Java.io.File(".").getAbsolutePath();
renvoie le répertoire de travail en cours.
L'appel à
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
renvoie le chemin d'accès au fichier JAR contenant la classe actuelle ou à l'élément CLASSPATH (chemin) qui a généré la classe actuelle si vous exécutez directement à partir du système de fichiers.
Exemple:
Votre application est située à
C:\MyJar.jar
Ouvrez le shell (cmd.exe) et cd
dans le sous-répertoire C:\test \.
Démarrez l'application à l'aide de la commande Java -jar C:\MyJar.jar
.
Les deux premiers appels renvoient 'C:\test\subdirectory'; le troisième appel renvoie 'C:\MyJar.jar'.
Lors de l'exécution à partir d'un système de fichiers plutôt que d'un fichier JAR, le résultat sera le chemin d'accès à la racine des fichiers de classe générés, par exemple
c:\Eclipse\workspaces\YourProject\bin\
Le chemin ne comprend pas les répertoires de package pour les fichiers de classe générés.
Exemple complet pour obtenir le répertoire de l’application sans nom de fichier .jar ou le chemin correspondant aux fichiers de classe s’il s’exécute directement à partir du système de fichiers (par exemple lors du débogage):
String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
if (applicationDir.endsWith(".jar"))
{
applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer
Dans .NET (C #, VB,…) , vous pouvez interroger l'instance actuelle Assembly
pour connaître sa Location
. Cependant, le nom de fichier de l'exécutable y est ajouté. Le code suivant désinfecte le chemin (using System.IO
et using System.Reflection
):
Directory.GetParent(Assembly.GetExecutingAssembly().Location)
Vous pouvez également utiliser les informations fournies par AppDomain
pour rechercher les assemblys référencés:
System.AppDomain.CurrentDomain.BaseDirectory
VB permet un autre raccourci via l’espace de noms My
:
My.Application.Info.DirectoryPath
Dans Windows, utilisez la fonction WinAPI GetModuleFileName () . Transmettez NULL pour que le descripteur de module obtienne le chemin du module actuel.
Python
path = os.path.dirname(__file__)
Cela obtient le chemin du module actuel.
Objective-C Cocoa (Mac OS X, je ne connais pas les spécificités de l'iPhone):
NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
Dans .Net vous pouvez utiliser
System.IO.Directory.GetCurrentDirectory
pour obtenir le répertoire de travail actuel de l'application, et dans VB.NET en particulier, vous pouvez utiliser
My.Application.Info.DirectoryPath
pour obtenir le répertoire de l'exe.
Dans VB6, vous pouvez obtenir le chemin de l'application à l'aide de la propriété App.Path
.
Notez que cela n’aura pas de \
final SAUF lorsque l’application se trouve à la racine du lecteur.
Dans l'IDE:
?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
Dans Java , il existe deux manières de trouver le chemin de l'application. L'une consiste à employer System.getProperty
:
System.getProperty("user.dir");
Une autre possibilité est l'utilisation de Java.io.File
:
new Java.io.File("").getAbsolutePath();
Encore une autre possibilité utilise la réflexion:
getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
Libc
Dans un environnement de type * nix (également Cygwin sous Windows):
#include <unistd.h>
char *getcwd(char *buf, size_t size);
char *getwd(char *buf); //deprecated
char *get_current_dir_name(void);
Delphi
Dans les applications Windows:
Unit Forms;
path := ExtractFilePath(Application.ExeName);
Dans les applications console:
Indépendamment de la langue, le premier paramètre de ligne de commande est le nom complet de l'exécutable:
Unit System;
path := ExtractFilePath(ParamStr(0));
EnPHP:
<?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).
?>
Dans Tcl
Chemin du script actuel:
set path [info script]
Chemin d'accès shell tcl:
set path [info nameofexecutable]
Si vous avez besoin du répertoire de ceux-ci, faites:
set dir [file dirname $path]
Obtenir le répertoire (de travail) actuel:
set dir [pwd]
Unix
Sous Unix, vous pouvez trouver le chemin d'accès à l'exécutable qui a été démarré à l'aide des variables d'environnement. C'est pas nécessairement un chemin absolu, vous devez donc combiner le répertoire de travail actuel (dans le shell: pwd
) et/ou la variable PATH avec la valeur de l'élément 0'th de l'environnement.
La valeur est toutefois limitée sous unix, car l'exécutable peut par exemple être appelé via un lien symbolique et seul le lien initial est utilisé pour la variable d'environnement. En général, les applications sur unix ne sont pas très robustes si elles l'utilisent pour des tâches intéressantes (telles que le chargement de ressources). Sous Unix, il est courant d'utiliser des emplacements codés en dur, par exemple un fichier de configuration dans /etc
où les emplacements de ressources sont spécifiés.
dans Android sa
getApplicationInfo().dataDir;
pour obtenir une carte SD, j'utilise
Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);
où ce dernier est utilisé pour stocker un type de fichier spécifique (Audio/Films, etc.). Vous avez des constantes pour ces chaînes dans la classe Environment.
Fondamentalement, pour tout ce qui concerne une application, utilisez la classe ApplicationInfo et tout ce qui concerne les données de la carte SD/Répertoire externe à l'aide de la classe d'environnement.
Docs: ApplicationInfo , Environnement
Dans bash , la commande 'pwd' renvoie le répertoire de travail actuel.
dans Rubis, l'extrait suivant renvoie le chemin du fichier source actuel:
path = File.dirname(__FILE__)
J'ai publié https://github.com/gpakosz/whereami qui résout le problème en C et vous donne:
Il utilise GetModuleFileNameW
sous Windows, analyse /proc/self/maps
sous Linux et Android et utilise _NSGetExecutablePath
ou dladdr
sur Mac et iOS.
En cmd (shell de ligne de commande Microsoft)
Vous pouvez obtenir le nom du script avec% * (peut être relatif à pwd)
Ceci obtient le répertoire du script:
set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%
Si vous trouvez des bugs, ce que vous ferez. Alors s'il vous plaît réparer ou commenter.
Java:
Sur tous les systèmes (Windows, Linux, Mac OS X) ne fonctionne que pour moi:
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;
}
DansCFML, il existe deux fonctions pour accéder au chemin d'un script:
getBaseTemplatePath()
getCurrentTemplatePath()
L’appel de getBaseTemplatePath renvoie le chemin du script de base, c’est-à-dire celui qui a été demandé par le serveur Web.
L’appel de getCurrentTemplatePath renvoie le chemin du script actuel, c’est-à-dire celui en cours d’exécution.
Les deux chemins sont absolus et contiennent le répertoire complet + le nom du fichier du script.
Pour déterminer uniquement le répertoire, utilisez la fonction getDirectoryFromPath( ... )
sur les résultats.
Donc, pour déterminer l'emplacement du répertoire d'une application, vous pouvez faire:
<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />
À l'intérieur de l'événement onApplicationStart
pour votre Application.cfc
Pour déterminer le chemin d'accès au serveur d'applications exécutant votre moteur CFML, vous pouvez accéder aux commandes Shell à l'aide de cfexecute. Vous pouvez donc (en tenant compte des discussions ci-dessus sur pwd/etc):
Unix:
<cfexecute name="pwd"/>
pour Windows, créez un pwd.bat
contenant le texte @cd
, puis:
<cfexecute name="C:\docume~1\myuser\pwd.bat"/>
(Utilisez l'attribut variable
de cfexecute
pour stocker la valeur au lieu de l'afficher à l'écran.)
Note pour répondre "20 ci-dessus, concernant Mac OSX uniquement: Si un exécutable JAR est transformé en" application "via le fichier JAR BUNDLER OSX, alors la méthode getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); répertoire actuel de l'application, mais ajoutera la structure de répertoire interne de l'application à la réponse. Cette structure interne est/theCurrentFolderWhereTheAppReside/Contents/Resources/Java/yourfile
C'est peut-être un petit bug en Java. Quoi qu’il en soit, il faut utiliser la méthode un ou deux pour obtenir la bonne réponse, et les deux donneront la bonne réponse même si l’application est lancée, par exemple. via un raccourci situé dans un autre dossier ou sur le bureau.
carl
SoundPimp.com