Rufen Sie den Pfad der Anwendung ab


79

Ich habe kürzlich gesucht, wie ich das Anwendungsverzeichnis in Java erhalten kann. Ich habe endlich die Antwort gefunden, aber ich habe überraschend lange gebraucht, weil die Suche nach einem solchen Oberbegriff nicht einfach ist. Ich denke, es wäre eine gute Idee, eine Liste zu erstellen, wie dies in mehreren Sprachen erreicht werden kann.

Fühlen Sie sich frei, nach oben / unten zu stimmen, wenn Sie die Idee (nicht) mögen, und tragen Sie bitte bei, wenn Sie sie mögen.

Klärung:

Es gibt eine feine Unterscheidung zwischen dem Verzeichnis, das die ausführbare Datei enthält, und dem aktuellen Arbeitsverzeichnis (angegeben pwdunter Unix). Ich war ursprünglich an Ersterem interessiert, kann aber auch Methoden zur Bestimmung des Letzteren veröffentlichen (um zu klären, welche Sie meinen).


3
Welchen Weg meinst du? Das aktuelle Arbeitsverzeichnis oder das Verzeichnis, in dem sich der ausführbare Code befindet?
Paul de Vrieze

Antworten:


59

In Java die Aufrufe

System.getProperty("user.dir")

und

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

Geben Sie das aktuelle Arbeitsverzeichnis zurück.

Der Anruf an

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

Gibt den Pfad zur JAR-Datei zurück, die die aktuelle Klasse enthält, oder zum CLASSPATH-Element (Pfad), das die aktuelle Klasse ergab, wenn Sie direkt vom Dateisystem ausgeführt werden.

Beispiel:

  1. Ihre Bewerbung befindet sich unter

     C:\MyJar.jar
    
  2. Öffnen Sie die Shell (cmd.exe) und wechseln Sie cdin das Unterverzeichnis C: \ test \.

  3. Starten Sie die Anwendung mit dem Befehl java -jar C:\MyJar.jar.

  4. Die ersten beiden Aufrufe geben 'C: \ test \ subdirectory' zurück. Der dritte Aufruf gibt 'C: \ MyJar.jar' zurück.

Wenn Sie von einem Dateisystem anstatt von einer JAR-Datei ausführen, ist das Ergebnis beispielsweise der Pfad zum Stammverzeichnis der generierten Klassendateien

c:\eclipse\workspaces\YourProject\bin\

Der Pfad enthält nicht die Paketverzeichnisse für die generierten Klassendateien.

Ein vollständiges Beispiel zum Abrufen des Anwendungsverzeichnisses ohne den Dateinamen .jar oder den entsprechenden Pfad zu den Klassendateien, wenn diese direkt vom Dateisystem ausgeführt werden (z. B. beim Debuggen):

String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

if (applicationDir.endsWith(".jar"))
{
    applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer

Ich habe nach einer Möglichkeit gesucht, schreibgeschützte Dateien in dasselbe Paket wie die Java-Klassen zu stellen ... getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (). GetPath () hat perfekt funktioniert, danke!
Fuzzy-Analyse

@fuzzyanalysis Genau dafür Class.getResource()ist.
Marquis von Lorne

22

In .NET (C #, VB,…) können Sie die aktuelle AssemblyInstanz nach ihrer abfragen Location. Hieran wird jedoch der Dateiname der ausführbaren Datei angehängt. Der folgende Code bereinigt den Pfad ( using System.IOund using System.Reflection):

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

Alternativ können Sie die von bereitgestellten Informationen verwenden, um AppDomainnach Baugruppen zu suchen, auf die verwiesen wird:

System.AppDomain.CurrentDomain.BaseDirectory

VB erlaubt eine weitere Verknüpfung über den MyNamespace:

My.Application.Info.DirectoryPath

1
Sie können Application.StartupPath auch für einige Programme verwenden. Für ASP.NET funktioniert dies jedoch nicht.
Jocull

1
Eigentlich ist es Application.ExecutablePath
zam664

9

In Windows - verwenden Sie die WinAPI Funktion GetModuleFileName () . Übergeben Sie NULL für das Modulhandle, um den Pfad für das aktuelle Modul abzurufen.


7

Python

path = os.path.dirname(__file__)

Damit wird der Pfad des aktuellen Moduls ermittelt.


5

Objective-C Cocoa (Mac OS X, ich kenne keine iPhone-Besonderheiten):

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

2
In meiner Mac OSX-App habe ich nach dem tatsächlichen Pfad zur ausführbaren Datei gesucht (zur Aufnahme in eine Liste) und Folgendes verwendet: NSString * executeablePath = [[NSBundle mainBundle] executeablePath]; - Es gibt auch eine 'ausführbare URL'-Version, um eine URL anstelle einer Zeichenfolge zurückzugeben
Todd

4

In Java gibt es zwei Möglichkeiten, den Pfad der Anwendung zu ermitteln. Eine ist zu beschäftigen System.getProperty:

System.getProperty("user.dir");

Eine andere Möglichkeit ist die Verwendung von java.io.File:

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

Eine weitere Möglichkeit besteht in der Reflexion:

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

1
Beachten Sie, dass dies etwas irreführend / verwirrend ist. Die drei von Ihnen angegebenen Methoden können zu völlig unterschiedlichen Ergebnissen führen!
Zarkonnen

Zarkonnen: Sie haben Recht, aber wie in meinem ursprünglichen Beitrag angedeutet, bin ich kein Experte. Dies ist ein Community-Wiki. Bitte zögern Sie nicht, meine Antwort zu bearbeiten / zu korrigieren!
Konrad Rudolph

TIPP: Normalerweise muss der Pfad nicht angegeben werden, wenn Sie auf eine Datei im aktuellen Arbeitsverzeichnis zugreifen möchten, z. B.: File = new File ("file.cfg"); Stellen Sie nur sicher, dass das Arbeitsverzeichnis während der Initialisierung oder bei der Anwendungsverknüpfung immer auf den Speicherort Ihrer Anwendung eingestellt ist.
Lepe

@lepe Legen Sie das Arbeitsverzeichnis beim Start nicht fest. Dies hat einige unerwünschte Konsequenzen, z. B. das standardmäßige Zeigen einiger Dialogfelder zur Dateiauswahl auf den Pfad der Anwendung und nicht auf das vom Benutzer ausgewählte Arbeitsverzeichnis.
Konrad Rudolph

1
Zwei Hauptprobleme beim letzten Ansatz: Zum einen kann ProtectionDomain.getCodeSource () null zurückgeben . Zweitens gibt URL.getPath () keinen Dateinamen zurück, sondern nur einen (möglicherweise maskierten) Pfadabschnitt einer URL. C:\Program Files\ExampleAppwird in URL-Form dargestellt als file:/C:/Program%20Files/ExampleApp, für die getPath () zurückgibt "/C:/Program%20Files/ExampleApp", was offensichtlich nicht existiert. Der einzig richtige Weg, eine URL in eine Datei zu konvertieren, ist new File(url.toURI()).
VGR

4

In VB6 können Sie den Anwendungspfad über das abrufen App.Path Eigenschaft .

Beachten Sie, dass dies kein \abschließendes EXCEPT hat, wenn sich die Anwendung im Stammverzeichnis des Laufwerks befindet.

In der IDE:

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

4

In .Net können Sie verwenden

System.IO.Directory.GetCurrentDirectory

um das aktuelle Arbeitsverzeichnis der Anwendung abzurufen, und speziell in VB.NET können Sie verwenden

My.Application.Info.DirectoryPath

um das Verzeichnis der exe zu erhalten.


3

Delphi

In Windows-Anwendungen:

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

In Konsolenanwendungen:

Unabhängig von der Sprache ist der erste Befehlszeilenparameter der vollständig qualifizierte Name der ausführbaren Datei:

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

3

Libc
In * nix-Umgebung (auch Cygwin in Windows):

  #include <unistd.h>

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

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

   char *get_current_dir_name(void);

Siehe Manpage


2

Unix

Unter Unix kann man den Pfad zu der ausführbaren Datei finden, die mit den Umgebungsvariablen gestartet wurde. Es ist nicht unbedingt ein absoluter Pfad, daher müssten Sie das aktuelle Arbeitsverzeichnis (in der Shell pwd:) und / oder die PATH-Variable mit dem Wert des 0-ten Elements der Umgebung kombinieren.

Der Wert ist unter Unix jedoch begrenzt, da die ausführbare Datei beispielsweise über eine symbolische Verknüpfung aufgerufen werden kann und nur die ursprüngliche Verknüpfung für die Umgebungsvariable verwendet wird. Im Allgemeinen sind Anwendungen unter Unix nicht sehr robust, wenn sie dies für interessante Zwecke verwenden (z. B. zum Laden von Ressourcen). Unter Unix werden häufig fest codierte Speicherorte für Dinge verwendet, z. B. eine Konfigurationsdatei, in der /etcdie Ressourcenspeicherorte angegeben sind.



2

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

2

in Android sein

getApplicationInfo().dataDir;

Um eine SD-Karte zu bekommen, benutze ich

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

wobei letzteres zum Speichern eines bestimmten Dateityps (Audio / Filme usw.) verwendet wird. Sie haben Konstanten für diese Zeichenfolgen in der Umgebungsklasse.

Grundsätzlich verwenden Sie für alles, was mit der App zu tun hat, die ApplicationInfo-Klasse und für alles, was mit Daten auf der SD-Karte / im externen Verzeichnis unter Verwendung der Environment-Klasse zu tun hat.

Dokumente: ApplicationInfo , Umgebung


2

In Tcl

Pfad des aktuellen Skripts:

set path [info script]

Tcl-Shell-Pfad:

set path [info nameofexecutable]

Wenn Sie eines dieser Verzeichnisse benötigen, gehen Sie wie folgt vor:

set dir [file dirname $path]

Aktuelles (Arbeits-) Verzeichnis abrufen:

set dir [pwd]

2

Java:

Auf allen Systemen (Windows, Linux, Mac OS X) funktioniert für mich nur Folgendes:

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

Dies löst NPE aus, wenn die Anwendung in einer JAR-Datei ausgeführt wird.
Marquis von Lorne

1

In Ruby gibt das folgende Snippet den Pfad der aktuellen Quelldatei zurück:

path = File.dirname(__FILE__)

1

In CFML gibt es zwei Funktionen für den Zugriff auf den Pfad eines Skripts:

getBaseTemplatePath()
getCurrentTemplatePath()

Durch Aufrufen von getBaseTemplatePath wird der Pfad des 'Base'-Skripts zurückgegeben, dh der vom Webserver angeforderte.
Durch Aufrufen von getCurrentTemplatePath wird der Pfad des aktuellen Skripts zurückgegeben, dh der Pfad, der gerade ausgeführt wird.

Beide Pfade sind absolut und enthalten das vollständige Verzeichnis + den Dateinamen des Skripts.

Verwenden Sie die Funktion getDirectoryFromPath( ... )für die Ergebnisse, um nur das Verzeichnis zu ermitteln .

Um den Verzeichnisspeicherort einer Anwendung zu bestimmen, haben Sie folgende Möglichkeiten:

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

Innerhalb der onApplicationStartVeranstaltung für IhreApplication.cfc



Um den Pfad zu bestimmen, auf dem sich der App-Server befindet, auf dem Ihre CFML-Engine ausgeführt wird, können Sie mit cfexecute auf Shell-Befehle zugreifen. So können Sie (unter Berücksichtigung der obigen Erläuterungen zu pwd / etc) Folgendes tun:

Unix:

<cfexecute name="pwd"/>

Erstellen Sie für Windows einen pwd.batenthaltenden Text @cdund dann:

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

(Verwenden Sie das variableAttribut von cfexecute, um den Wert zu speichern, anstatt ihn auf dem Bildschirm auszugeben.)


1

In cmd (die Microsoft-Befehlszeilen-Shell)

Sie können den Namen des Skripts mit% * abrufen (möglicherweise relativ zu pwd).

Dies erhält Verzeichnis des Skripts:

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

Wenn Sie Fehler finden, werden Sie. Dann bitte korrigieren oder kommentieren.


1

Ich habe https://github.com/gpakosz/whereami veröffentlicht , das das Problem in C löst und Ihnen Folgendes bietet:

  • der Pfad zur aktuellen ausführbaren Datei
  • Der Pfad zum aktuellen Modul (unterscheidet sich vom Pfad zur ausführbaren Datei, wenn aus einer gemeinsam genutzten Bibliothek aufgerufen wird).

Es verwendet GetModuleFileNameWunter Windows, analysiert /proc/self/mapsunter Linux und Android und verwendet _NSGetExecutablePathoder dladdrauf Mac und iOS.


0

Hinweis zur Beantwortung von "20 oben nur für Mac OSX: Wenn eine ausführbare JAR-Datei über den OSX-JAR-BUNDLER in eine" App "umgewandelt wird, gibt getClass (). GetProtectionDomain (). GetCodeSource (). GetLocation (); aktuelles Verzeichnis der App, fügt jedoch die interne Verzeichnisstruktur der App zur Antwort hinzu. Diese interne Struktur einer App lautet / theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile

Vielleicht ist dies ein kleiner Fehler in Java. Auf jeden Fall muss man Methode eins oder zwei verwenden, um die richtige Antwort zu erhalten, und beide liefern die richtige Antwort, selbst wenn die App gestartet wird, z. B. über eine Verknüpfung in einem anderen Ordner oder auf dem Desktop.

Carl

SoundPimp.com

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.