Obtener la ruta de la aplicación

Recientemente busqué cómo podría obtener el directorio de la aplicación en Java. Finalmente encontré la respuesta, pero he necesitado mucho tiempo porque la búsqueda de un término tan genérico no es fácil. Creo que sería una buena idea comstackr una lista de cómo lograr esto en múltiples idiomas.

Siéntete libre de subir / bajar votos si a ti (no) te gusta la idea y por favor contribuye si te gusta.

Aclaración:

Hay una distinción fina entre el directorio que contiene el archivo ejecutable y el directorio de trabajo actual (dado por pwd bajo Unix). Originalmente me interesaron los primeros, pero también puedo publicar los métodos para determinar los últimos (aclarando a cuál te refieres).

En Java las llamadas

 System.getProperty("user.dir") 

y

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

devuelve el directorio de trabajo actual.

La llamada a

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

devuelve la ruta al archivo JAR que contiene la clase actual, o el elemento CLASSPATH (ruta) que produjo la clase actual si se está ejecutando directamente desde el sistema de archivos.

Ejemplo:

  1. Su aplicación se encuentra en

      C:\MyJar.jar 
  2. Abra el shell (cmd.exe) y cd en C: \ test \ subdirectorio.

  3. Inicie la aplicación utilizando el comando java -jar C:\MyJar.jar .

  4. Las primeras dos llamadas devuelven ‘C: \ test \ subdirectorio’; la tercera llamada devuelve ‘C: \ MyJar.jar’.

Cuando se ejecuta desde un sistema de archivos en lugar de un archivo JAR, el resultado será la ruta a la raíz de los archivos de clase generados, por ejemplo

 c:\eclipse\workspaces\YourProject\bin\ 

La ruta no incluye los directorios de paquetes para los archivos de clase generados.

Un ejemplo completo para obtener el directorio de la aplicación sin el nombre del archivo .jar, o la ruta correspondiente a los archivos de la clase si se ejecuta directamente desde el sistema de archivos (por ejemplo, al depurar):

 String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); if (applicationDir.endsWith(".jar")) { applicationDir = new File(applicationDir).getParent(); } // else we already have the correct answer 

En .NET (C #, VB, …) , puede consultar la instancia de Assembly actual para su Location . Sin embargo, esto tiene el nombre del archivo ejecutable adjunto. El siguiente código desinfecta la ruta ( using System.IO y using System.Reflection ):

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

Alternativamente, puede usar la información provista por AppDomain para buscar ensambles referenciados:

 System.AppDomain.CurrentDomain.BaseDirectory 

VB permite otro atajo a través del espacio de nombres My :

 My.Application.Info.DirectoryPath 

En Windows , use la función WinAPI GetModuleFileName () . Pase NULL para el identificador del módulo para obtener la ruta del módulo actual.

Pitón

 path = os.path.dirname(__file__) 

Eso obtiene la ruta del módulo actual.

Objective-C Cocoa (Mac OS X, no sé para las características del iPhone):

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

En Java , hay dos formas de encontrar la ruta de la aplicación. Una es emplear System.getProperty :

 System.getProperty("user.dir"); 

Otra posibilidad es el uso de java.io.File :

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

Sin embargo, otra posibilidad usa la reflexión:

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

En VB6, puede obtener la ruta de la aplicación utilizando la propiedad App.Path .

Tenga en cuenta que esto no tendrá un \ EXCEPT posterior cuando la aplicación se encuentre en la raíz de la unidad.

En el IDE:

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

En .Net puedes usar

System.IO.Directory.GetCurrentDirectory

para obtener el directorio de trabajo actual de la aplicación, y en VB.NET específicamente puede usar

My.Application.Info.DirectoryPath

para obtener el directorio del exe

Delphi

En aplicaciones de Windows:

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

En aplicaciones de consola:

Independientemente del idioma, el primer parámetro de línea de comando es el nombre ejecutable completo:

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

Libra
En entorno de tipo * nix (también Cygwin en Windows):

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

Ver la página man

Unix

En Unix uno puede encontrar la ruta al ejecutable que se inició utilizando las variables de entorno. No es necesariamente una ruta absoluta, por lo que necesitaría combinar el directorio de trabajo actual (en el shell: pwd ) y / o la variable PATH con el valor del elemento 0’th del entorno.

Sin embargo, el valor está limitado en Unix, ya que el ejecutable se puede llamar, por ejemplo, a través de un enlace simbólico, y solo el enlace inicial se usa para la variable de entorno. En general, las aplicaciones en Unix no son muy robustas si usan esto para cualquier cosa interesante (como cargar recursos). En Unix, es común usar ubicaciones codificadas para cosas, por ejemplo, un archivo de configuración en /etc donde se especifican las ubicaciones de los recursos.

En bash , el comando ‘pwd’ devuelve el directorio de trabajo actual.

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

en Android es

 getApplicationInfo().dataDir; 

para obtener una tarjeta SD, la uso

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

donde este último se usa para almacenar un tipo específico de archivo (Audio / Películas, etc.). Tiene constantes para estas cadenas en la clase de entorno.

Básicamente, para todo lo relacionado con la aplicación, use la clase ApplicationInfo y para todo lo que tenga que ver con los datos de la tarjeta SD / Directorio externo utilizando la clase de entorno.

Documentos: ApplicationInfo , Environment

En Tcl

Ruta del script actual:

 set path [info script] 

Ruta de shell Tcl:

 set path [info nameofexecutable] 

Si necesita el directorio de cualquiera de estos, haga:

 set dir [file dirname $path] 

Obtener el directorio actual (de trabajo):

 set dir [pwd] 

en Ruby , el siguiente fragmento devuelve la ruta del archivo fuente actual:

 path = File.dirname(__FILE__) 

En CFML hay dos funciones para acceder a la ruta de un script:

 getBaseTemplatePath() getCurrentTemplatePath() 

Llamar a getBaseTemplatePath devuelve la ruta de la secuencia de comandos ‘base’, es decir, la que solicitó el servidor web.
Llamar a getCurrentTemplatePath devuelve la ruta del script actual, es decir, el que se está ejecutando actualmente.

Ambas rutas son absolutas y contienen el directorio completo + nombre de archivo del script.

Para determinar solo el directorio, use la función getDirectoryFromPath( ... ) en los resultados.

Entonces, para determinar la ubicación del directorio de una aplicación, podría hacer:

  

Dentro del evento onApplicationStart para su Application.cfc


Para determinar la ruta en la que se encuentra el servidor de aplicaciones que ejecuta su motor CFML, puede acceder a comandos de shell con cfexecute, por lo que (teniendo en cuenta las discusiones sobre pwd / etc) puede hacer lo siguiente:

Unix:

  

para Windows, cree un pwd.bat contenga el texto @cd , luego:

  

(Use el atributo variable de cfexecute para almacenar el valor en lugar de mostrar en pantalla).

En cmd (el shell de línea de comandos de Microsoft)

Puede obtener el nombre del script con% * (puede ser relativo a pwd)

Esto obtiene un directorio de script:

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

Si encuentra algún error, lo hará. Entonces arregla o comenta.

Lancé https://github.com/gpakosz/whereami que resuelve el problema en C y te da:

  • la ruta al ejecutable actual
  • la ruta al módulo actual (se diferencia de la ruta en ejecutable al llamar desde una biblioteca compartida).

Utiliza GetModuleFileNameW en Windows, analiza /proc/self/maps en Linux y Android y usa _NSGetExecutablePath o dladdr en Mac e iOS.

Java:

En todos los sistemas (Windows, Linux, Mac OS X) solo funciona para mí:

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

Nota para responder “20 arriba sobre Mac OSX solamente: si un ejecutable JAR se transforma en una” aplicación “a través de OSX JAR BUNDLER, entonces el getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); NO devolverá el directorio actual de la aplicación, pero agregará la estructura de directorio interno de la aplicación a la respuesta. Esta estructura interna de una aplicación es / theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile

Quizás esto es un pequeño error en Java. De todos modos, uno debe usar el método uno o dos para obtener la respuesta correcta, y ambos entregarán la respuesta correcta, incluso si la aplicación se inicia, por ejemplo, a través de un acceso directo ubicado en una carpeta diferente o en el escritorio.

carl

SoundPimp.com