2013-07-30 39 views
11

Ho creato una pura app java che mi dice del numero di file in una determinata directory. Ora ho impostato directory corrente utilizzando il seguente codice:Come ottenere il percorso della directory di esecuzione in java

`File f = new File(".");` 

Dopo che ho fatto un programma di installazione con il suo file jar e installato nel mio Windows 8 e poi lo aggiungo alle finestre fare clic destro menu a discesa (contesto menu). Quando lo avvio dal menu di scelta rapida mi dice sempre del numero di file nella directory in cui è effettivamente installato, tuttavia voglio sapere il numero di file di quella directory da dove lo sto eseguendo.

Quindi, aiutatemi. Sono un novizio in questo campo e non voglio che mi confondano nella directory corrente e nella directory di esecuzione corrente. Così scrivo così a lungo e sperando in una risposta pulita con parole molto semplici.

Grazie

+0

Would [questo tutorial] (http: // www. howtogeek.com/howto/windows-vista/add-any-application-to-the-desktop-right-click-menu-in-vista/) ti aiuta? – mthmulders

+0

Un po 'di codice sarà molto utile per ottenere la risposta –

+0

@abu si è compilato per me. Ti consiglio di provarlo e sono sicuro che jdk non farà alcuna parzialità con te. –

risposta

15

Come Jarrod Roberson segnala nel his answer here:

Un modo potrebbe utilizzare lo system property System.getProperty("user.dir"); questo ti darà "La directory di lavoro attuale quando le proprietà sono state inizializzate". Questo è probabilmente quello che vuoi. per scoprire dove il comando java è stato emesso , nel tuo caso nella directory con i file da elaborare, anche sebbene il file .jar effettivo possa risiedere da qualche altra parte sulla macchina . Avere la directory del file .jar effettivo non è quella utile nella maggior parte dei casi.

Di seguito vi stampare la directory corrente da cui è stato richiamato il comando indipendentemente da dove il .class o file .jar il file .class è in.

public class Test 
{ 
    public static void main(final String[] args) 
    { 
     final String dir = System.getProperty("user.dir"); 
     System.out.println("current dir = " + dir); 
    } 
} 

se siete in /User/me/ e la vostra Il file .jar contenente il codice sopra è in /opt/some/nested/dir/ il comando java -jar /opt/some/nested/dir/test.jar Test emetterà current dir = /User/me.

Si consiglia inoltre di utilizzare un buon parser per argomenti da riga di comando con oggetto orientato agli oggetti. Consiglio vivamente JSAP, l'analizzatore di argomenti semplice Java . Ciò ti consente di utilizzare System.getProperty("user.dir") e in alternativa di inviare qualcosa in per superare il comportamento. Una soluzione molto più gestibile. Ciò renderebbe molto semplice il passaggio nella directory da elaborare, e sarà possibile eseguire il backup su user.dir se non è stato inoltrato nulla.

Esempio: GetExecutionPath

import java.util.*; 
import java.lang.*; 

public class GetExecutionPath 
{ 
    public static void main(String args[]) { 
    try{ 
     String executionPath = System.getProperty("user.dir"); 
     System.out.print("Executing at =>"+executionPath.replace("\\", "/")); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

uscita per quanto sopra sarà come

C:\javaexamples>javac GetExecutionPath.jav 

C:\javaexamples>java GetExecutionPath 
Executing at =>C:/javaexamples 
+2

'System.getProperty (" user.dir ")' e 'new File (". ")' [Di solito restituiscono lo stesso valore] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Quindi, perché dovrebbe funzionare, mentre 'new File (". ")' Non lo fa, secondo la domanda? – mthmulders

+0

Ancora una volta, non puoi semplicemente lanciare un link alla fine di una risposta in cui hai copiato il testo di qualcun altro. Devi citare esplicitamente la lingua copiata in modo che le persone sappiano che non è il tuo contributo originale. –

3

che seguono possono aiutare a

System.getProperty("user.dir") 

Ciò restituirà voi il percorso come una stringa

+0

sì, l'ho fatto anch'io, e ovviamente ho ottenuto il percorso nella stringa ma voglio sapere il percorso di quella directory da dove sto eseguendolo non di quella directory in cui è installato. –

+0

@Mohd Faizan Khan, i non sono sicuro del tuo fabbisogno. Sei il percorso di installazione prima dell'esecuzione? – Karthikeyan

+0

'System.getProperty (" user.dir ")' e 'new File (". ")' [Di solito restituiscono lo stesso valore] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Quindi, perché dovrebbe funzionare, mentre 'new File (". ")' Non lo fa, secondo la domanda? – mthmulders

0

Ci sono un paio di cose diverse che potrebbe essere interessato:

  • Get attuale directory di lavoro: String workingDir = System.getProperty("user.dir");

  • ottenere il percorso class loader: URL resource = classLoader.getResource("/");

+0

'System.getProperty (" user.dir ")' e 'new File (". ")' [Di solito restituiscono lo stesso valore] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Quindi, perché dovrebbe funzionare, mentre 'new File (". ")' Non lo fa, secondo la domanda? – mthmulders

5

si possono fare alcune cose folli:

String absolute = getClass().getProtectionDomain().getCodeSource().getLocation().toExternalForm(); 
absolute = absolute.substring(0, absolute.length() - 1); 
absolute = absolute.substring(0, absolute.lastIndexOf("/") + 1); 
String configPath = absolute + "config/file.properties"; 
String os = System.getProperty("os.name"); 
if (os.indexOf("Windows") != -1) { 
    configPath = configPath.replace("/", "\\\\"); 
    if (configPath.indexOf("file:\\\\") != -1) { 
     configPath = configPath.replace("file:\\\\", ""); 
    } 
} else if (configPath.indexOf("file:") != -1) { 
    configPath = configPath.replace("file:", ""); 
} 

Io lo uso per leggere un file di configurazione relativ al percorso di esecuzione. Puoi usarlo anche per ottenere il percorso di esecuzione del tuo file jar.

0

Il File Javadoc indica che un file relativo viene in genere risolto rispetto alla directory utente corrente. Continua:

Questa directory è denominata dalla proprietà di sistema user.dir ed è in genere la directory in cui è stata richiamata la macchina virtuale Java.

Pertanto, sia lo new File(".") che lo System.getProperty("user.dir"); restituirebbero lo stesso risultato. In base alla domanda, stai eseguendo da un menu di scelta rapida di Windows Explorer, che è probabilmente un po 'diverso da una normale chiamata JVM.

Quello che dovete fare, secondo this tutorial, è la seguente:

  1. Creare una nuova chiave di registro di seguito HKEY_CLASSES_ROOT\Directory\Background\shell. Il suo nome verrà utilizzato nel menu di scelta rapida di Explorer, quindi diamo il valore MyJavaApp.
  2. Creare una nuova chiave di registro sotto HKEY_CLASSES_ROOT\Directory\Background\shell\MyJavaApp e denominarlo command. Il suo valore dovrebbe essere il completo percorso per l'applicazione Java. È possibile aggiungere %1 al comando come segnaposto per il file/directory correntemente selezionato. Ciò significa che il tuo programma verrà invocato con un argomento aggiuntivo.
  3. Il programma può leggere l'argomento aggiuntivo per determinare da quale directory è stato chiamato.

Si noti che i passaggi precedenti (ed esercitazione) sono per Windows Vista, per cui si potrebbe desiderare di controllare due funziona anche per Windows 8.

Problemi correlati