2010-03-25 9 views
6

Aus Java extrahiere ich eine ausführbare Datei an einen Speicherort, der mit File.createTempFile() angegeben wurde. Wenn ich versuche, meine ausführbare Datei auszuführen, hängt mein Programm, wenn es versucht, die erste Zeile der Ausgabe zu lesen.Wie entschärfte ich Windows Dateinamen in Java?

Ich habe festgestellt, dass, wenn ich versuche, die gleiche extrahierte ausführbare Datei von einem anderen Programm auszuführen, funktioniert, wenn ich das Verzeichnis C: \ Dokumente und Einstellungen \ Benutzername \ Lokale Einstellungen \ Temp \ prog.exe angeben. Aber wenn ich das Verzeichnis als C: \ DOCUME ~ 1 \ USERNA ~ 1 \ LOCALS ~ 1 \ Temp \ prog.exe angeben, bekomme ich den Hang.

Gibt es eine Möglichkeit, den Tilde-Dateinamen in meinem Programm zu entmangeln, damit ich einen Verzeichnisnamen angeben kann, der funktioniert?

(Und da ich immer wie die Sprache und API Design-Fragen Adressierung, gibt es keinen Grund, warum Java File.createTempFile() und java.io.tmpdir zu verstümmelte Dateinamen zu bewerten haben?)

Antwort

10

können Sie verwenden getCanonicalPath(), um den erweiterten Pfad zu erhalten. Z.B .:

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

... produziert ...

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

ich dies auf XP getestet, aber annehmen, dass es auf anderen Windows-Betriebssystemen ähnlich funktionieren würde.

Siehe @ raviaws Antwort auf Ihre zweite Frage.

+0

Bessere Antwort als meine, obwohl ich bezweifle, dass dies sein Problem ist. –

+0

Das scheint tatsächlich die Dateinamen zu entfremden! Irgendwie hängt es immer noch, wenn ich renne. Ich verstehe nicht, warum, aber, aber daran arbeiten ... – skiphoppy

+0

Ah hah! Ich musste close() auf dem OutputStream aufrufen, den ich benutzte, als ich die ausführbare Datei extrahierte. Bei meinem Test wurde versehentlich der fehlende Dateiname für eine ausführbare Datei (und nicht geschlossen()) von meiner Anwendung übergeben und ein vollständiger Dateiname für eine nicht mehr verwendete vorherige Extraktion übergeben. – skiphoppy

3

Wow, das habe ich nie gesehen. Tatsache ist, dass die Umgebungsvariable% TEMP% einen verstümmelten Namen zurückgibt (dies von meinem Computer ist):

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

Unter der Annahme, dass eine neu erstellen Java VM die Umgebungsvariable verwendet den temporären Ordner zu bekommen, ist es nicht VMs Fehler, dass die Verzeichnisse nicht mehr funktionieren.

Und auch wenn Sie versuchen, System.getenv() verwenden, um den temporären Ordner zu erhalten, haben Sie immer noch das gleiche Problem.

Ich würde sicherstellen, dass:

  • Das Problem wird durch die Tatsache verursacht wird, dass Sie ein Verzeichnis „prog.exe“ genannt haben (basierend auf Ihre Frage, ich dies gehe davon aus);
  • Wenn die Datei "prog.exe" ist, wenn sie nicht von einem anderen Programm verwendet wurde (ein Antivirus, vielleicht);
  • Überprüfen Sie, ob Ihr Computer gesund ist (dies wäre ein sehr kritischer Fehler für jede Anwendung, die keine Webanwendung ist und temporäre Dateien benötigt).
+0

+1 für die Antwort auf seine zweite Frage, die ich vergessen habe zu adressieren. – Chris

+0

Es stellte sich heraus, dass es von einem anderen Programm verwendet wurde ... der Anwendung, die ich schrieb.Der hatte es extrahiert und nie close() genannt. Also alle Anrufe zu versuchen, um es auszuführen, ob von meinem Test oder von der Anwendung, waren auf unbestimmte Zeit hängen und warten auf diese schließen() und die resultierende Flush to Disk. – skiphoppy