Obtener la ruta de la aplicación

79

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

No dude en votar a favor o en contra si (no) le gusta la idea y contribuya si le gusta.

Aclaración:

Hay una fina distinción entre el directorio que contiene el archivo ejecutable y el directorio de trabajo actual (dado por pwdbajo Unix). Originalmente estaba interesado en el primero, pero siéntase libre de publicar métodos para determinar el segundo también (aclarando a cuál se refiere).

Konrad Rudolph
fuente
3
¿A qué camino te refieres? ¿El directorio de trabajo actual o el directorio en el que reside el código ejecutable?
Paul de Vrieze

Respuestas:

59

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 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 el cdsubdirectorio C: \ test \.

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

  4. Las dos primeras llamadas devuelven 'C: \ test \ subdirectory'; 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 del paquete para los archivos de clase generados.

Un ejemplo completo para obtener el directorio de la aplicación sin el nombre de archivo .jar, o la ruta correspondiente a los archivos de 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
Thomas Feilkas
fuente
Estaba buscando una manera de poner archivos de solo lectura en el mismo paquete que las clases java ... getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (). GetPath () funcionó perfectamente, ¡gracias!
Análisis difuso
@fuzzyanalysis Para eso es exactamente Class.getResource().
user207421
22

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

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

Como alternativa, puede usar la información proporcionada por AppDomainpara buscar ensamblados referenciados:

System.AppDomain.CurrentDomain.BaseDirectory

VB permite otro acceso directo a través del Myespacio de nombres:

My.Application.Info.DirectoryPath
Konrad Rudolph
fuente
1
También puede utilizar Application.StartupPath para algunos programas. Sin embargo, no funcionará para ASP.NET.
jocull
1
En realidad, es Application.ExecutablePath
zam664
9

En Windows , utilice la función GetModuleFileName () de WinAPI . Pase NULL para que el identificador del módulo obtenga la ruta del módulo actual.

MrZebra
fuente
7

Pitón

path = os.path.dirname(__file__)

Eso obtiene la ruta del módulo actual.

Fara
fuente
5

Objective-C Cocoa (Mac OS X, no sé las especificidades de iPhone):

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
Mouviciel
fuente
2
En mi aplicación Mac OSX, estaba buscando la ruta real al archivo ejecutable (para incluirlo en un plist) y usé esto: NSString * ejecutablePath = [[NSBundle mainBundle] ejecutablePath]; - también hay una versión 'ejecutableURL' para devolver una URL en lugar de una cadena
Todd
4

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

System.getProperty("user.dir");

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

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

Otra posibilidad más usa la reflexión:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
Konrad Rudolph
fuente
1
Tenga en cuenta que esto es un poco engañoso / confuso. ¡Los tres métodos que cita pueden dar resultados completamente diferentes!
Zarkonnen
Zarkonnen: Tienes razón, pero como se implica en mi publicación original, no soy un experto. Esta es una wiki de la comunidad. ¡No dude en editar / corregir mi respuesta!
Konrad Rudolph
SUGERENCIA: Normalmente, no es necesario especificar la ruta si desea acceder a un archivo en el directorio de trabajo actual, como: file = new File ("file.cfg"); Solo asegúrese de establecer siempre el directorio de trabajo en la ubicación de su aplicación durante la inicialización o en el acceso directo de la aplicación.
lepe
@lepe No establezca el directorio de trabajo en el inicio, esto tiene algunas consecuencias no deseadas, como señalar algunos diálogos de selección de archivos de forma predeterminada a la ruta de la aplicación, en lugar del directorio de trabajo elegido por el usuario.
Konrad Rudolph
1
Dos problemas importantes con el último enfoque: uno, ProtectionDomain.getCodeSource () puede devolver nulo . Dos, URL.getPath () no devuelve un nombre de archivo, solo devuelve una parte de la ruta (posiblemente escapada) de una URL. C:\Program Files\ExampleAppse representa en forma de URL como file:/C:/Program%20Files/ExampleApp, para lo cual devuelve getPath () "/C:/Program%20Files/ExampleApp", que obviamente no existe. La única forma correcta de convertir una URL en un archivo es new File(url.toURI()).
VGR
4

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

Tenga en cuenta que esto no tendrá un final \EXCEPTO cuando la aplicación esté en la raíz de la unidad.

En el IDE:

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

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.

d7samurai
fuente
3

Delphi

En aplicaciones de Windows:

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

En aplicaciones de consola:

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

Unit System;
path := ExtractFilePath(ParamStr(0));
Ralph M. Rickenbach
fuente
3

Entorno de
tipo Libc In * nix (también Cygwin en Windows):

  #include <unistd.h>

   char *getcwd(char *buf, size_t size);

   char *getwd(char *buf); //deprecated

   char *get_current_dir_name(void);

Ver página man

Rajish
fuente
2

Unix

En Unix, uno puede encontrar la ruta al ejecutable que se inició usando las variables de entorno. Es no necesariamente una ruta absoluta, por lo que tendría que combinar el directorio de trabajo actual (en la cáscara: pwd) y / o variable PATH con el valor del elemento de orden 0 del medio ambiente.

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 se utiliza el enlace inicial para la variable de entorno. En general, las aplicaciones en Unix no son muy robustas si lo usan para algo interesante (como cargar recursos). En Unix, es común usar ubicaciones codificadas de forma rígida para las cosas, por ejemplo, un archivo de configuración en /etcel que se especifican las ubicaciones de los recursos.

Paul de Vrieze
fuente
2

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

Cedric Meury
fuente
Desafortunadamente, pwddevuelve el directorio de trabajo actual que puede diferir de la ruta del script.
Konrad Rudolph
2
La respuesta se encuentra en stackoverflow.com/questions/59895/…
Konrad Rudolph
2

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

en Android es

getApplicationInfo().dataDir;

para obtener la tarjeta SD, uso

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

donde este último se utiliza para almacenar un tipo específico de archivo (audio / películas, etc.). Tiene constantes para estas cadenas en la clase Environment.

Básicamente, para cualquier cosa que tenga que ver con la aplicación, use la clase ApplicationInfo y para cualquier cosa que tenga que ver con los datos en la tarjeta SD / Directorio externo usando la clase Environment.

Documentos: ApplicationInfo , Environment

rishi
fuente
2

En Tcl

Ruta de la secuencia de comandos actual:

set path [info script]

Ruta del shell de Tcl:

set path [info nameofexecutable]

Si necesita el directorio de cualquiera de estos, haga:

set dir [file dirname $path]

Obtener directorio actual (de trabajo):

set dir [pwd]
Cristi Diaconescu
fuente
2

Java:

En todos los sistemas (Windows, Linux, Mac OS X) me funciona solo esto:

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;
}
Cuarc
fuente
Esto genera NPE si la aplicación se ejecuta en un archivo JAR.
user207421
1

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

path = File.dirname(__FILE__)
bltxd
fuente
1

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 + el 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, puede hacer:

<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />

Dentro del onApplicationStartevento para tuApplication.cfc



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

Unix:

<cfexecute name="pwd"/>

para Windows, cree un pwd.battexto que contenga @cd, luego:

<cfexecute name="C:\docume~1\myuser\pwd.bat"/>

(Utilice el variableatributo de cfexecutepara almacenar el valor en lugar de enviarlo a la pantalla).

Peter Boughton
fuente
1

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 el directorio del script:

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

Si encuentra algún error, lo hará. Entonces, por favor, corrija o comente.

ctrl-alt-delor
fuente
1

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 (difiere de la ruta al ejecutable cuando se llama desde una biblioteca compartida).

Se usa GetModuleFileNameWen Windows, analiza /proc/self/mapsen Linux y Android y usa _NSGetExecutablePatho dladdren Mac e iOS.

Gregory Pakosz
fuente
0

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

Quizás este sea 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

carl
fuente