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 de beaucoup de temps car la recherche d’un terme générique n’est pas facile. Je pense que ce serait une bonne idée de comstackr une liste de la façon de réaliser cela dans plusieurs langues.

N’hésitez pas à monter / descendre si vous n’aimez pas l’idée et s’il vous plaît consortingbuez si vous l’aimez.

Clarification:

Il existe une distinction fine entre le répertoire contenant le fichier exécutable et le répertoire de travail en cours (donné par pwd sous Unix). Au départ, je m’intéressais à la première mais je suis libre de mettre en place des méthodes pour déterminer la seconde (en précisant celle 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’access au fichier JAR contenant la classe actuelle ou l’élément CLASSPATH (chemin) qui a généré la classe actuelle si vous l’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 en utilisant la commande java -jar C:\MyJar.jar .

  4. Les deux premiers appels renvoient ‘C: \ test \ sous-répertoire’; 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’access à la racine des fichiers de classe générés, par exemple

 c:\eclipse\workspaces\YourProject\bin\ 

Le chemin n’inclut pas les répertoires de package pour les fichiers de classe générés.

Un exemple complet pour obtenir le répertoire de l’application sans nom de fichier .jar ou le chemin correspondant vers les fichiers de classe s’il est exécuté directement à partir du système de fichiers (par exemple lors du débogage):

 Ssortingng 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 d’ Assembly cours pour connaître son Location . Cependant, le nom de fichier de l’exécutable est ajouté. Le code suivant nettoie le chemin d’access (en using System.IO et en using System.Reflection ):

 Directory.GetParent(Assembly.GetExecutingAssembly().Location) 

Vous pouvez également utiliser les informations fournies par AppDomain pour rechercher des assemblys référencés:

 System.AppDomain.CurrentDomain.BaseDirectory 

VB autorise un autre raccourci via l’espace de noms My :

 My.Application.Info.DirectoryPath 

Sous Windows , utilisez la fonction WinAPI GetModuleFileName () . Transmettez NULL pour que le handle de module obtienne le chemin du module en cours.

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 iPhone):

 NSSsortingng * applicationPath = [[NSBundle mainBundle] bundlePath]; 

En Java , il existe deux manières de trouver le chemin de l’application. L’une consiste à utiliser 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 reflection:

 getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

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 \ EXCEPT à la fin de l’application dans la racine du lecteur.

Dans l’EDI:

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

Dans .Net, vous pouvez utiliser

System.IO.Directory.GetCurrentDirectory

pour obtenir le répertoire de travail actuel de l’application, et dans VB.NET spécifiquement, vous pouvez utiliser

My.Application.Info.DirectoryPath

pour obtenir le répertoire de l’exe.

Delphes

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 d’exécutable qualifié complet:

 Unit System; path := ExtractFilePath(ParamStr(0)); 

Libc
Dans un environnement de type * nix (également Cygwin sous Windows):

  #include  char *getcwd(char *buf, size_t size); char *getwd(char *buf); //deprecated char *get_current_dir_name(void); 

Voir la page de manuel

Unix

Dans Unix, on peut trouver le chemin d’access à l’exécutable qui a été démarré à l’aide des variables d’environnement. Ce n’est pas nécessairement un chemin absolu, vous devrez 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 ‘de l’environnement.

La valeur est toutefois limitée dans 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 sous Unix ne sont pas très robustes si elles sont utilisées pour quelque chose d’intéressant (comme le chargement de ressources). Sous Unix, il est courant d’utiliser des emplacements codés en dur pour des éléments, par exemple un fichier de configuration dans /etc où les emplacements des ressources sont spécifiés.

En bash , la commande ‘pwd’ renvoie le répertoire de travail en cours.

En PHP :

  

dans Android son

 getApplicationInfo().dataDir; 

pour obtenir une carte SD, j’utilise

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

où ce dernier est utilisé pour stocker un type spécifique de fichier (Audio / Films, etc.). Vous avez des constantes pour ces chaînes dans la classe Environment.

Fondamentalement, pour quoi que ce soit avec l’application, utilisez la classe ApplicationInfo et pour tout ce qui concerne les données dans la carte SD / le répertoire externe en utilisant la classe d’environnement.

Docs: ApplicationInfo , Environment

Dans Tcl

Chemin du script en cours:

 set path [info script] 

Chemin de shell Tcl:

 set path [info nameofexecutable] 

Si vous avez besoin du répertoire de l’un de ceux-ci, faites:

 set dir [file dirname $path] 

Récupère le répertoire actuel (actif):

 set dir [pwd] 

dans Ruby , l’extrait de code suivant renvoie le chemin du fichier source actuel:

 path = File.dirname(__FILE__) 

En CFML, il y a deux fonctions pour accéder au chemin d’un script:

 getBaseTemplatePath() getCurrentTemplatePath() 

L’appel de getBaseTemplatePath renvoie le chemin du script ‘base’, c’est-à-dire celui demandé par le serveur Web.
L’appel de getCurrentTemplatePath renvoie le chemin du script actuel, c’est-à-dire celui qui est 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:

  

Intérieur de l’événement onApplicationStart pour votre Application.cfc


Pour déterminer le chemin d’access du serveur d’applications exécutant votre moteur CFML, vous pouvez accéder aux commandes shell avec cfexecute. Par conséquent, vous pouvez faire ce qui suit (en gardant à l’esprit les discussions sur pwd / etc):

Unix:

  

pour Windows, créez un pwd.bat contenant le texte @cd , puis:

  

(Utilisez l’atsortingbut variable de cfexecute pour stocker la valeur au lieu de la générer à l’écran.)

Dans cmd (le shell de ligne de commande Microsoft)

Vous pouvez obtenir le nom du script avec% * (peut être relatif à pwd)

Cela obtient un répertoire de script:

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

Si vous trouvez des bugs, vous le ferez. Alors s’il vous plaît réparer ou commenter.

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

  • le chemin d’access à l’exécutable actuel
  • le chemin d’access au module actuel (différent du chemin d’access à l’exécutable lors d’un appel depuis une bibliothèque partagée).

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

Java:

Sur tous les systèmes (Windows, Linux, Mac OS X) fonctionne uniquement 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; } 

Remarque pour répondre “20 ci-dessus concernant Mac OSX uniquement: si un exécutable JAR est transformé en une” application “via le fichier JAR BUNDLER d’OSX, alors getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); répertoire actuel de l’application, mais appenda la structure de répertoire interne de l’application à la réponse.Cette structure interne d’une application 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 réponse correcte, et les deux fourniront la réponse correcte même si l’application est démarrée, par exemple via un raccourci situé dans un dossier différent ou sur le bureau.

carl

SoundPimp.com