2012-01-31 70 views
2

今天我正忙於java.io.File方法,偶然發現了一些奇怪的東西。無法刪除我在Java中重命名的目錄中的文件?

當我重命名目錄時,我似乎無法刪除文件或新目錄。

File dir = new File("dir"); 
    dir.mkdir(); 

    File file = new File(dir, "afile.txt"); 
    file.createNewFile(); 

    File newname = new File(dir, "newName.txt"); 
    file.renameTo(newname); 

    File newdir = new File("newdir"); 
    dir.renameTo(newdir); 

    System.out.println("file exists? " + file.exists()); 
    System.out.println("file deleted? " + file.delete()); 
    System.out.println("newname exists? " + newname.exists()); 
    System.out.println("deleted newname? " + newname.delete()); 
    System.out.println("dir exists? " + dir.exists()); 
    System.out.println("dir deleted? " + dir.delete()); 
    System.out.println("newdir exists? " + newdir.exists()); 
    System.out.println("deleted newdir? " + newdir.delete()); 

產生了輸出:

file exists? false 
    file deleted? false 
    newname exists? false 
    deleted newname? false 
    dir exists? false 
    dir deleted? false 
    newdir exists? true 
    deleted newdir? false 

在文件系統中,雖然NEWDIR和newname.txt都依然存在!

但是,如果我註釋掉目錄的重命名,刪除工作正常。

delete()和rename()之間是否還需要了解其他規則? javadoc沒有太多。

回答

6

我沒有看到輸出的任何問題:

  1. 在重命名結束,只有newdir/newdir/newName.txt存在。因此前六行輸出應該是false,它們是。 (特別地,newname變量仍指dir/newName.txt,不再存在。)

  2. newdir確實存在;你的輸出證實了這一點。

  3. 最終的delete()不起作用,因爲該目錄不是空的。

總之,一切看起來都像預期的那樣工作。

+0

爲什麼我不能刪除newName.txt? – 2012-01-31 13:48:35

+2

@jonnyfive:因爲它試圖刪除'dir/newName.txt',並且不再存在(你已經將它重命名爲'newdir/newName.txt')。 – NPE 2012-01-31 13:51:08

+0

您需要記住兩件關於java.io.File實例的內容。 1)它們代表路徑名稱而不是文件2)它們是不可變的。這就解釋了你爲什麼要觀察這種行爲。 – Lajcik 2013-09-16 11:41:38

0

如果底層文件通道尚未被JVM關閉,您將無法從資源管理器中刪除文件,因爲它們仍將被標記爲已鎖定。

1

正如艾克斯在他的評論中所說:它試圖刪除dir/newName.txt,而這已經不存在了,因爲您已將其更名爲newdir/newName.txt

相關問題