2010-03-25 22 views
6

從Java中,我將可執行文件解壓縮到使用File.createTempFile()指定的位置。當我嘗試運行我的可執行文件時,我的程序在嘗試讀取第一行輸出時掛起。如何在Java中取消Windows文件名的縮放?

我發現如果我嘗試從另一個程序運行相同的解壓縮的可執行文件,它將起作用,如果我將該目錄指定爲C:\ Documents and Settings \ username \ Local Settings \ Temp \ prog.exe。但是,如果我將目錄指定爲C:\ DOCUME〜1 \ USERNA〜1 \ LOCALS〜1 \ Temp \ prog.exe,我會得到掛起。

有沒有辦法在我的程序中取消波形文件名,這樣我可以指定一個可以工作的目錄名稱?

(而且因爲我總是喜歡解決語言和API設計的問題,是沒有任何理由的Java File.createTempFile()和java.io.tmpdir必須評估,以錯位的文件名?)

回答

10

您可以使用getCanonicalPath()獲取擴展路徑。例如: -

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

... ...產生

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

我測試了這個在XP,但相信它會的工作同樣對其他Windows操作系統。

請參閱@ raviaw對第二個問題的回答。

+0

比我的回答更好,雖然我懷疑這是他的問題。 – 2010-03-25 19:06:48

+0

這確實看起來可以解壓縮文件名!不過,當我跑步時它仍然會掛起。我不明白爲什麼,但是,正在努力... – skiphoppy 2010-03-25 19:08:40

+0

啊哈!我必須在我提取可執行文件時使用的OutputStream上調用close()。 原來我的測試中,我無意中通過我的應用程序仍然在使用(而不是關閉())的可執行文件的損壞文件名,併爲不再使用的先前提取文件傳遞完整文件名。 – skiphoppy 2010-03-25 19:15:00

3

哇,我從來沒有見過。事實是,環境變量%TEMP%返回一個錯位的名稱(這是從我的電腦):

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

假設一個新創建的Java虛擬機使用環境變量來獲得臨時文件夾的位置,它不虛擬機的錯誤,目錄即將破損。

即使您嘗試使用System.getenv()來獲取臨時文件夾,您仍然會遇到同樣的問題。

我將確保:

  • 的問題不是由事實,你已經被稱爲「prog.exe」(根據您的問題,我假定這)一個目錄所致;
  • 如果文件是「prog.exe」,如果它沒有被任何其他程序使用(可能是殺毒軟件)。
  • 檢查您的計算機是否理智(這對於任何不是Web應用程序且需要臨時文件的應用程序來說都是非常關鍵的錯誤)。
+0

+1爲他的第二個問題的答案,我忘了解決。 – Chris 2010-03-25 19:16:34

+0

原來,它正在被另一個程序使用......我正在編寫的應用程序。它已經提取了它,並且從來沒有調用close()。因此,無論是從我的測試還是從應用程序嘗試運行它的所有調用都無限期地等待close()以及由此產生的刷新到磁盤。 – skiphoppy 2010-03-25 19:16:41