web-dev-qa-db-fra.com

Obtenir le chemin de l'application

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.

Clarification:

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

79
Konrad Rudolph

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: 

  1. Votre application est située à 

     C:\MyJar.jar
    
  2. Ouvrez le shell (cmd.exe) et cd dans le sous-répertoire C:\test \.

  3. Démarrez l'application à l'aide de la commande Java -jar C:\MyJar.jar.

  4. 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
58
Thomas Feilkas

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

Dans Windows, utilisez la fonction WinAPI GetModuleFileName () . Transmettez NULL pour que le descripteur de module obtienne le chemin du module actuel.

9
MrZebra

Python

path = os.path.dirname(__file__)

Cela obtient le chemin du module actuel.

7
Alex McBride

Objective-C Cocoa (Mac OS X, je ne connais pas les spécificités de l'iPhone):

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

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.

4
d7samurai

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
4
Deanna

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();
4
Konrad Rudolph

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

Voir la page de manuel

3
Rajish

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

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

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]
2
Cristi Diaconescu

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.

2
Paul de Vrieze

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

2
rishi

Dans bash , la commande 'pwd' renvoie le répertoire de travail actuel.

2
Cedric Meury

dans Rubis, l'extrait suivant renvoie le chemin du fichier source actuel:

path = File.dirname(__FILE__)
1
bltxd

J'ai publié https://github.com/gpakosz/whereami qui résout le problème en C et vous donne:

  • le chemin de l'exécutable en cours
  • le chemin d'accès au module actuel (diffère d'un chemin d'accès à un exécutable lors d'un appel depuis une bibliothèque partagée).

Il utilise GetModuleFileNameW sous Windows, analyse /proc/self/maps sous Linux et Android et utilise _NSGetExecutablePath ou dladdr sur Mac et iOS.

1
Gregory Pakosz

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.

1
ctrl-alt-delor

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

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

1
Peter Boughton

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

0
carl