2013-06-13 124 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)