2010-03-25 10 views
6

Z Java wypakowuję plik wykonywalny do określonej lokalizacji przy użyciu File.createTempFile(). Kiedy próbuję uruchomić mój plik wykonywalny, mój program zawiesza się, gdy próbuje odczytać pierwszy wiersz danych wyjściowych.Jak odłączyć nazwy plików systemu Windows w języku Java?

Odkryłem, że jeśli spróbuję uruchomić ten sam wyodrębniony plik wykonywalny z innego programu, działa, jeśli określę katalog jako C: \ Documents and Settings \ nazwa_użytkownika \ Ustawienia lokalne \ Temp \ prog.exe. Ale jeśli określę katalog jako C: \ DOCUME ~ 1 \ USERNA ~ 1 \ LOCALS ~ 1 \ Temp \ prog.exe, zawiesi się.

Czy istnieje sposób na odblokowanie nazwy pliku tyldy w moim programie, aby można było podać nazwę katalogu, która będzie działać?

(A ponieważ ja zawsze jak rozwiązywaniu problemów projektowych językowe i API, jest jakiś powód, dla którego Java File.createTempFile() i java.io.tmpdir trzeba ocenić na zniekształconych nazw?)

Odpowiedz

10

Można użyć getCanonicalPath(), aby uzyskać rozwiniętą ścieżkę. Np .:

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

... produkuje ...

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

Przetestowałem to na XP, ale zakładamy, że to działa podobnie na innych systemach operacyjnych Windows.

Zobacz odpowiedź @ raviaw na twoje drugie pytanie.

+0

Lepsza odpowiedź niż moja, choć wątpię, że to jego problem. –

+0

Rzeczywiście, wydaje się, że odszyfrowano nazwy plików! Wciąż jednak wisi, kiedy biegnę. Nie rozumiem dlaczego, ale pracuję nad tym ... – skiphoppy

+0

Ah hah! Musiałem wywołać metodę close() na OutputStream, której użyłem przy wyodrębnianiu pliku wykonywalnego. Okazuje się, że nieumyślnie przekazałem zmanipulowaną nazwę pliku wykonywalnemu, który nadal jest w użyciu (i nie jest zamknięty()) przez moją aplikację, i przekazałem pełną nazwę pliku dla niezużytego wcześniejszego ekstrakcji. – skiphoppy

3

Wow, nigdy tego nie widziałem. Faktem jest, że zmienna środowiskowa% TEMP% zwraca zniekształcone nazwisko (to jest z mojego komputera):

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

Zakładając, że java nowo utworzyć VM używa zmiennej środowiskowej aby uzyskać tymczasową lokalizację folderu, nie jest Usterka VM, że katalogi są zmanipulowane.

Nawet jeśli spróbujesz użyć System.getenv(), aby uzyskać folder tymczasowy, nadal będziesz mieć ten sam problem.

chciałbym się upewnić, że:

  • Problemem nie jest spowodowane przez fakt, że masz katalog o nazwie „prog.exe” (w oparciu o swoje pytanie, jestem przy założeniu, this);
  • Jeśli plik to "prog.exe", jeśli nie był używany przez żaden inny program (może być to program antywirusowy);
  • Sprawdzanie, czy komputer jest zdrowy (to byłby bardzo krytyczny błąd dla dowolnej aplikacji, która nie jest aplikacją internetową i wymaga plików tymczasowych).
+0

+1 za odpowiedź na drugie pytanie, na które zapomniałem odpowiedzieć. – Chris

+0

Okazuje się, że był używany przez inny program ... aplikację, którą pisałem.Który rozpakował go i nigdy nie wywołał close(). Tak więc wszystkie wywołania, aby spróbować uruchomić, czy to z mojego testu, czy z aplikacji, wisiały w nieskończoność czekając na ten close() i wynikowy flush na dysku. – skiphoppy