2010-03-25 16 views
6

Da Java, sto estraendo un eseguibile in una posizione specificata utilizzando File.createTempFile(). Quando provo a eseguire il mio eseguibile, il mio programma si blocca quando tenta di leggere la prima riga di output.Come posso rimuovere i nomi file di Windows in Java?

Ho scoperto che se provo a eseguire lo stesso eseguibile estratto da un altro programma, funziona se si specifica la directory come C: \ Documents and Settings \ nomeutente \ Impostazioni locali \ Temp \ prog.exe. Ma se si specifica la directory come C: \ DOCUME ~ 1 \ USERNA ~ 1 \ LOCALS ~ 1 \ Temp \ prog.exe ottengo il blocco.

C'è un modo per sbrogliare il nome di file tilde nel mio programma in modo da poter specificare un nome di directory che funzionerà?

(E siccome mi piace sempre affrontare i problemi di progettazione di lingua e di API, v'è alcuna ragione per cui Java File.createTempFile() e java.io.tmpdir devono valutare per i nomi di file straziati?)

risposta

10

È possibile utilizzare getCanonicalPath() per ottenere il percorso espanso. Es .:

try 
{ 
    File file = File.createTempFile("abc", null); 
    System.out.println(file.getPath()); 
    System.out.println(file.getCanonicalPath()); 
} 
catch (IOException e) {} 

... produce ...

C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\abc49634.tmp 
C:\Documents and Settings\username\Local Settings\Temp\abc49634.tmp 

Ho provato questo su XP, ma assumere che avrebbe funzionato allo stesso modo su altri sistemi operativi Windows.

Vedere la risposta di @ raviaw alla seconda domanda.

+0

Risposta migliore della mia, anche se dubito che questo sia il suo problema. –

+0

Sembra proprio che distrugga i nomi dei file! In qualche modo si blocca ancora quando corro, però. Non capisco perché, ancora, ma ci lavoriamo ... – skiphoppy

+0

Ah ah! Ho dovuto chiamare close() sul OutputStream che ho usato quando ho estratto l'eseguibile. Si è verificato il mio test, inavvertitamente ho passato il nome file manglinato per un eseguibile ancora in uso (e non chiuso()) dalla mia applicazione e passando un nome file completo per un'estrazione precedente non più utilizzata. – skiphoppy

3

Wow, non l'ho mai visto. Il fatto è che l'ambiente% TEMP variabile% restituisce un nome storpiato (questo è dal mio computer):

 
TEMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 
TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 

Partendo dal presupposto che una nuova creazione di Java VM utilizza la variabile d'ambiente per ottenere la posizione della cartella temporanea, non è La colpa di VM è che le directory stanno venendo mutilate.

E anche se si tenta di utilizzare System.getenv() per ottenere la cartella temporanea, si avrà ancora lo stesso problema.

vorrei fare in modo che:

  • Il problema non è causato dal fatto che avete una directory chiamata "PROG.EXE" (in base alla tua domanda, io parto dal presupposto questo);
  • Se il file è "prog.exe", se non era in uso da nessun altro programma (un antivirus, forse);
  • Controllare se il computer è sano (questo sarebbe un bug molto critico per qualsiasi applicazione che non sia un'applicazione web e che necessiti di file temporanei).
+0

+1 per la risposta alla sua seconda domanda che ho dimenticato di affrontare. – Chris

+0

Si è scoperto che era in uso da un altro programma ... l'applicazione che stavo scrivendo.Che l'aveva estratto e mai chiamato close(). Quindi tutte le chiamate per provare ad eseguirlo, sia dal mio test o dall'applicazione, erano sospese indefinitamente in attesa di quella close() e del flush risultante su disco. – skiphoppy

Problemi correlati