2009-12-16 62 views
16

我對JDK7中所有這些新的文件I/O類感到困惑。如何在JDK7中重命名(不移動)文件?

比方說,我有一個Path並且想要重命名文件,它代表。
如果預計再次出現Path,我如何指定新名稱?

Path p = /* path to /home/me/file123 */; 
Path name = p.getName(); /* gives me file123 */ 
name.moveTo(/* what now? */); /* how to rename file123 to file456? */ 

注:爲什麼我需要JDK7?處理符號鏈接

問題是:我必須用文件來完成,它的名稱和位置在運行時是已知的。所以,我需要的是一個安全方法(沒有特殊的副作用)來創建一個新名稱 - 路徑的一些舊名稱路徑。

Path newName(Path oldName, String newNameString){ 
    /* magic */ 
} 

回答

6

你有一個路徑字符串,你需要創建Path實例。您可以使用getPath方法或解決方法來執行此操作。這裏有一種方法:

Path dir = oldFile.getParent();   
    Path fn = oldFile.getFileSystem().getPath(newNameString); 
    Path target = (dir == null) ? fn : dir.resolve(fn);   
    oldFile.moveTo(target); 

請注意,它檢查父母是否爲空(看起來像你的解決方案不這樣做)。

0

如果目標路徑是相同的,除了該文件的名稱源路徑,它將被重命名,而不是移動。

因此,對於你的榜樣,對moveTo路徑應該是

/home/me/file456 
+1

所以我可以創建一個新的'路徑'?是否有比以下更簡單的路徑:Path newName = Paths.get(name.getParent()。toString()+ pathSeparator +「newName」); ? – 2009-12-16 12:54:09

+0

是的,現在的問題是:如何以安全的方式創建這樣的路徑,以便沒有特殊的情況會導致它失敗。 – 2009-12-16 12:59:36

+0

我可以嘗試描述如何採用原始路徑,取消名稱'file123'來連接'file456',並調用'name.moveTo()',但由於我並不真正瞭解Java,因此我會猜測。我** **肯定**的是,如果只有文件名不同,a * move *就會變成*重命名*。 – pavium 2009-12-16 13:02:43

1

如果你看看Apache Commons IO有一個名爲FileNameUtils類。這確實有很多東西。文件路徑名稱和將(除其他外)可靠地分割路徑名稱等。我認爲這應該讓你很長的路要走你想要的。

+0

對不起,我需要符號鏈接感知的API。所有這些Apache Commons的東西至多與Java-5兼容,但主要是Java-1.4。 – 2009-12-16 13:09:56

+0

它不能幫助你純粹分裂和重新組合文件名,你可以使用Java 7符號鏈接感知的東西來實際執行復制/重命名? – 2009-12-16 13:12:17

+0

處理符號鏈接的好功能僅由JDK7提供,因爲它具有與操作系統的低級(二進制級別)綁定。 – 2009-12-16 13:12:52

4

OK,亂投醫出來後,似乎我找到了正確的方法:

// my helper method 
Path newName(Path oldFile, String newNameString){ 
    // the magic is done by Path.resolve(...) 
    return oldFile.getParent().resolve(newNameString); 
} 

// so, renaming is done by: 
oldPath.moveTo(newName(oldFile, "newName")); 
0

如果你不能使用Java來做你想要的Unix操作,我推薦Python腳本(由你的Java程序運行)。 Python已經獲得了對Unix腳本的支持,並且它不是Perl)。這對你來說可能聽起來不夠好,但是在一個更大的程序中,你將從使用正確的工具獲益。

47

在JDK7,Files.move()爲重命名文件短而簡潔的語法:

Path newName(Path oldName, String newNameString){ 
    return Files.move(oldName, oldName.resolveSibling(newNameString)); 
} 

首先我們得到的路徑使用Path.resolveSibling() 新的文件名和我們使用Files.move()做實際的重命名。