2010-04-13 33 views
1

在Java中,我與在WinXP下運行的代碼創建這樣一個文件的工作:無法訪問Java創建的文件 - 有時


    public synchronized void store(Properties props, byte[] data) { 
     try { 
     File file = filenameBasedOnProperties(props); 
     if (file.exists()) { 
      return; 
     }   
     File temp = File.createTempFile("tempfile", null); 
     FileOutputStream out = new FileOutputStream(temp); 
     out.write(data); 
     out.flush(); 
     out.close(); 
     file.getParentFile().mkdirs(); 
     temp.renameTo(file); 
     } 
     catch (IOException ex) { 
     // Complain and whine and stuff 
     } 
    } 

有時候,當創建一個文件這種方式,它是幾乎完全無法從代碼之外訪問(儘管負責打開和讀取文件的代碼沒有問題),即使應用程序沒有運行。當通過Windows資源管理器訪問時,我無法移動,重命名,刪除甚至打開文件。在Cygwin的,我得到了下面的時候我ls -l目錄:

 
ls: cannot access [big-honkin-filename] 
total 0 
?????????? ? ? ? ?   ? [big-honkin-filename] 

所暗示,文件名都大了,但在260個字符的最大值爲XP(儘管它們是略微超過200個字符)。

爲了進一步增加我的電腦只是想讓我感到愚蠢的感覺,有時這個代碼創建的文件是完全正常的。我發現的唯一模式是,一旦目錄中的一個文件「鎖定」,剩下的就被擰緊了。

有人曾經遇到過這樣的事情,或者對這裏發生的事情有什麼見解?

+1

(OT)當您即將關閉文件時,不需要刷新 - close()會執行所有需要的刷新。 – 2010-04-13 15:32:05

+2

你應該檢查mkdirs的返回值和renameTo – LB40 2010-04-13 15:39:58

回答

1

雖然根據定義,NTFS應該處理路徑長度可達2^15-1,在實踐路徑的長度被限制爲255

您可以創建一個較長的路徑名的文件(文件名包括父文件夾名稱),但之後無法訪問它們。我在這些情況下得到的錯誤是無法找到該文件。爲了擺脫這些文件,我必須縮短父文件夾的名稱,直到路徑長度足夠短爲止。

+0

神聖的廢話,這正是它是什麼。謝謝! – BlairHippo 2010-04-13 17:31:16

3

確保您始終關閉finally區塊中的流。在你的情況下,如果拋出異常,流可能不會關閉,並會泄漏文件句柄。您可以使用SysInternals中的procexp來查看哪個進程持有該文件的句柄。

+0

合理的建議和一個值得調整,但它不會拋出一個異常,所以這似乎不太可能是我的根本原因。 – BlairHippo 2010-04-13 15:24:15

+0

Process Explorer不顯示任何人擁有該文件的句柄;我在Find - > Find Handle或DLL中輸入文件名,並在搜索中獲得0個匹配項。 – BlairHippo 2010-04-13 15:29:49