2012-07-19 31 views
1

我知道這可能已經在這裏回答了一百萬次,但是我看過的所有內容都沒有幫助我。這裏是我的代碼:java renameTo方法不起作用

for(File g: f.listFiles()){ 
    for(File h : g.listFiles()){ 
     try{ 
      Scanner s = new Scanner(h); 
      String timestamp = s.next().split("[?]")[4]; 
      File z = new File(h.getAbsolutePath().split("[.]")[0] + timestamp + h.getAbsolutePath().split("[.]")[1]); 
      boolean q = h.renameTo(z); 
     }catch(Exception e){ 

     } 
    } 
} 

我檢查過,看看是否存在文件z,它沒有。我檢查過,如果文件h存在,它確實存在。我已經加倍檢查,h是絕對路徑。如果我打印z的絕對路徑,我會得到正確的路徑。 f中的任何目錄或g中的文件都不打開。由h表示的文件未打開。有沒有一些標誌設置或文件上的Windows不允許我的程序重命名?

+1

這可能很容易成爲權限問題。是拋出異常,還是'renameTo()'返回'false'? – dlev 2012-07-19 22:40:41

+0

如果z不存在,那麼可能你的字符串在新的File()中是不正確的,我不知道所有的分割是什麼,因爲我不知道如何命名文件。當你只是在filz z = new File(...)的圓括號內打印println()時,輸出是什麼?另外,在catch塊中添加e.printStackTrace();它可以啓發你的問題 – 2012-07-19 22:41:13

+0

不會引發異常。假返回 – user972276 2012-07-19 22:42:25

回答

3

我的猜測是,你有類似的問題,以一個我在這裏File deletion/moving failing

嘗試使用FileinputStreams掃描儀

FileInputStream fin = new FileInputStream(h); 
fin.open() 
Scanner s = new Scanner(fin); 
//do work 
fin.close() 

和重命名

+0

ahhh是!謝謝。我完全忘記了我正在用掃描儀打開文件,它不能被重命名,因爲它在我的程序中打開。 – user972276 2012-07-19 22:48:52

2

的行爲之前關閉流renameTo因平臺而異。在一個平臺上成功的操作可能會失敗。例如,在我的本地開發工作站(OS X)上,一切都按預期工作。在生產系統(Solaris)上,renameTo一致失敗。當文件位於不同的分區時,我終於確定它失敗了。顯然這不是這種情況,但它表明該方法可以以意想不到的方式行事。

要獲得一致的行爲,請將數據複製到新文件,然後刪除原始文件。

1

我有一個幾乎相同的問題。一些重命名案件成功,一些失敗。對於那些失敗的案例,我發現,源文件路徑和目標文件路徑不在同一個文件系統中。在我的情況下,NTFS掛載了目標文件將被移動到的另一個文件系統。由於重命名函數的原始目的只是重命名一個名稱,而不是移動相關文件的數據。如果源文件路徑和目標文件路徑都位於不同的文件系統中,某些版本的JVM將在某些平臺上失敗。實際上,這是java.io中的一個bug,Solaris已經修復了新版本中的這個bug。 祝你好運!

HappyForever,

+0

這非常有幫助。原來我們的問題是,我們試圖在我們的Unix服務器上的不同掛載點之間renameTo()。將目標目錄移動到同一個分區允許renameTo()按預期工作。 – 2014-06-27 22:30:55