2014-12-06 99 views
9

我想在dev-test-prod安裝程序中放置一些核心文件。基本上,如果文件較新,則需要將其作爲質量檢查過程的一部分複製到下一級別。Java NIO Files.createFile()失敗,出現NoSuchFileException

我使用的是Java 8,因此我決定嘗試第一次使用NIO文件/路徑apis。我很老,從事編程已經48年了,自1996年初以來幾乎完全使用Java,以及自發布之後的每一個版本,所以這個NIO「增強」應該不會太難以吸收,但是。 。 。

FileSystem fs = FileSystems.getDefault(); 
Path in = fs.getPath(fromFileName); 
Path out = fs.getPath(toFileName); 

if (Files.exists(out)) { 
    FileTime inTime = Files.getLastModifiedTime(in); 
    FileTime outTime = Files.getLastModifiedTime(out); 

    if (0 > outTime.compareTo(inTime)) { 
    Files.copy(in, out, StandardCopyOption.REPLACE_EXISTING); 
    } 
} else { 
    Files.createFile(out); 
    Files.copy(in, out); 
} 

最初我只是試圖Files.copy()不Files.createFile(),並得到了NoSuchFileException上的副本()調用。

我看了幾個引用這個的StackOverflow帖子,其中一個聲明權威地說,如果目標文件尚不存在,copy()將會失敗。對於我的生活,我無法理解爲什麼設計師認爲這是一個好主意,但也是如此。我相應地添加了上面的createFile()調用(讀取了文件的API文檔,它說Files.createFile()「創建一個新的空文件,如果文件已經存在則失敗。」當我再次運行它時,但是在createFile()而不是copy()上,注意路徑在Windows的home目錄中,所以不會發生任何拒絕訪問的問題,除了包含這個項目的Eclipse之外,沒有任何東西在我的PC上運行?這個時候

java.nio.file.NoSuchFileException: C:\Users\ChrisGage\myproject\site\ttws\css\core.css 
at sun.nio.fs.WindowsException.translateToIOException(Unknown Source) 
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source) 
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source) 
at sun.nio.fs.WindowsFileSystemProvider.newByteChannel(Unknown Source) 
at java.nio.file.Files.newByteChannel(Unknown Source) 
at java.nio.file.Files.createFile(Unknown Source) 
... 

我在做什麼錯

+2

也許一個文件夾丟失,因此無法創建文件? – 2014-12-06 18:51:04

回答

15

Files.copy()(和Files.move()爲此事)是「愚蠢的」;它不會嘗試做以下任一操作:

  • 複製整個目錄層次結構;
  • 移動整個目錄層次結構(如果源和目標位於不同的文件系統上);
  • 創建缺失的目錄等

你需要做的:複製文件

final Path tmp = out.getParent(); 
if (tmp != null) // null will be returned if the path has no parent 
    Files.createDirectories(tmp); 

之前。

+1

謝謝,就是這樣。現在它與舊流實現的loc數相同。 – casgage 2014-12-06 23:11:52

相關問題