2013-06-13 71 views
4

我想將txt文件添加到zip文件內的文件夾中。 首先,我提取zip文件的所有內容,然後添加txt文件,然後再壓縮。 然後我閱讀了關於nio方法,我可以在不提取它的情況下修改zip。使用這種方法,我可以將txt文件添加到zip的主文件夾中,但我無法深入。將文件添加到zip文件中的文件夾java

testing.zip文件中有res文件夾。

這裏是我的代碼:

 Path txtFilePath = Paths.get("\\test\\prefs.txt"); 
     Path zipFilePath = Paths.get("\\test\\testing.zip"); 
     FileSystem fs; 
     try { 
      fs = FileSystems.newFileSystem(zipFilePath, null); 
      Path fileInsideZipPath = fs.getPath("res/prefs.txt"); //when I remover "res/" code works. 
      Files.copy(txtFilePath, fileInsideZipPath); 
      fs.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

我得到以下異常:

java.nio.file.NoSuchFileException: res/ 

回答

2

(編輯給實際的答案)

務必:

fs.getPath("res").resolve("prefs.txt") 

而不是:

fs.getPath("res/prefs.txt") 

.resolve()方法做正確的事與問候到文件分隔符等

+0

該目錄已存在於zip文件中。 – irmu

+0

嘗試和'fs.getPath(「res」)。resolve(「prefs.txt」)',然後,而不是'fs.getPath(「res/prefs.txt」)' – fge

+0

fs.getPath(「res」) .resolve(「prefs.txt」)的作品,謝謝! – irmu

1

fs.getPath("res/prefs.txt")當然應該工作,你不需要爲經批准的回答說把它拆分fs.getPath("res").resolve("prefs.txt")

例外java.nio.file.NoSuchFileException: res/有點混亂,因爲它提到文件,但實際上目錄丟失。

我也有類似的問題,我所要做的就是:

if (fileInsideZipPath.getParent() != null) 
    Files.createDirectories(fileInsideZipPath.getParent()); 

查看完整的例子:

@Test 
public void testAddFileToArchive() throws Exception { 
    Path fileToAdd1 = rootTestFolder.resolve("notes1.txt"); 
    addFileToArchive(archiveFile, "notes1.txt", fileToAdd1); 

    Path fileToAdd2 = rootTestFolder.resolve("notes2.txt"); 
    addFileToArchive(archiveFile, "foo/bar/notes2.txt", fileToAdd2); 

    . . . 
} 


public void addFileToArchive(Path archiveFile, String pathInArchive, Path srcFile) throws Exception {   
    FileSystem fs = FileSystems.newFileSystem(archiveFile, null); 
    Path fileInsideZipPath = fs.getPath(pathInArchive); 
    if (fileInsideZipPath.getParent() != null) Files.createDirectories(fileInsideZipPath.getParent()); 
    Files.copy(srcFile, fileInsideZipPath, StandardCopyOption.REPLACE_EXISTING); 
    fs.close(); 
} 

如果我刪除Files.createDirectories()位,並確保明確的開始有明確的測試目錄,我得到:

java.nio.file.NoSuchFileException: foo/bar/ 
at com.sun.nio.zipfs.ZipFileSystem.checkParents(ZipFileSystem.java:863) 
at com.sun.nio.zipfs.ZipFileSystem.newOutputStream(ZipFileSystem.java:528) 
at com.sun.nio.zipfs.ZipPath.newOutputStream(ZipPath.java:792) 
at com.sun.nio.zipfs.ZipFileSystemProvider.newOutputStream(ZipFileSystemProvider.java:285) 
at java.nio.file.Files.newOutputStream(Files.java:216) 
at java.nio.file.Files.copy(Files.java:3016) 
at java.nio.file.CopyMoveHelper.copyToForeignTarget(CopyMoveHelper.java:126) 
at java.nio.file.Files.copy(Files.java:1277) 
at my.home.test.zipfs.TestBasicOperations.addFileToArchive(TestBasicOperations.java:111) 
at my.home.test.zipfs.TestBasicOperations.testAddFileToArchive(TestBasicOperations.java:51)