在zip中写入(修改或添加)文件

时间:2013-02-01 13:16:50

标签: java file zip nio archive

我已按照说明进行操作 this thread,使用那里的代码我已经能够将文件添加到zip文件而不解压缩并重新压缩它,但我有一个问题,让我告诉你我的代码:

private void saveFileIntoProjectArchive(Path pathOfFile) {
    this.projectArchiveFile.setWritable(true, false);
    Path zipFilePath = Paths.get(this.projectArchiveFile.getAbsolutePath()),
            pathToSaveInsideZIP = null;
    FileSystem fs;
    try {
        fs = FileSystems.newFileSystem(zipFilePath, null);
        pathToSaveInsideZIP = fs.getPath(pathOfFile.toString().substring((int) this.transactionalProjectFolder.getAbsolutePath().length()));
        System.out.println("Coping from:\n\t"+pathOfFile+"\nto\n\t"+pathToSaveInsideZIP);
        Files.copy(pathOfFile, pathToSaveInsideZIP, REPLACE_EXISTING);
        System.out.println("Done!!!");
        fs.close();
    } catch (java.nio.file.NoSuchFileException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    projectArchiveFile.setWritable(false, false);
}

我正在尝试做的是,我有很多文件用于同一个项目,该项目是一个存档(ZIP,在代码中由java.io.File引用,名为projectArchiveFile,我的实例变量)包含所有这些文件的类,当我想使用我的存档中的某个文件时,我只将该文件解压缩到一个文件夹中,该文件夹的结构与我的存档中的文件相同(ZIP,projectArchiveFile),对该文件夹的引用是一个名为transactionalProjectFolder的java.io.File,也是我的类的实例变量。但是给了我这个错误:

来自:     C:\ Dir1 \ Dir2 \ Dir3 \存档开始stucure \存档结构的另一个文件夹副本\ Excel File.xlsm 至     \ Archive of Stucure \归档结构的另一个文件夹副本\ Excel File.xlsm

java.nio.file.NoSuchFileException: Begin of Archive stucure\Another folder replica of the archive structure\ at com.sun.nio.zipfs.ZipFileSystem.checkParents(ZipFileSystem.java:846)
at com.sun.nio.zipfs.ZipFileSystem.newOutputStream(ZipFileSystem.java:515)
at com.sun.nio.zipfs.ZipPath.newOutputStream(ZipPath.java:783)
at com.sun.nio.zipfs.ZipFileSystemProvider.newOutputStream(ZipFileSystemProvider.java:276)
at java.nio.file.Files.newOutputStream(Files.java:170)
at java.nio.file.Files.copy(Files.java:2826)
at java.nio.file.CopyMoveHelper.copyToForeignTarget(CopyMoveHelper.java:126)
at java.nio.file.Files.copy(Files.java:1222)

堆栈跟踪的其余部分是我的类。

我已经能够在存档(zip)的根目录中写入,但每当我尝试在存档(zip)内部的文件夹内写入时,它都会失败,因为您可以在堆栈跟踪中注意到,它说java.nio.file.NoSuchFileException: Begin of Archive stucure\Another folder replica of the archive structure\并且它在名称之前停止,如果我正在尝试复制的文件,我完全确定zip中的路径存在并且它被恰当地拼写它只是不想写(我正在尝试使用Files.copy和Files.move)存档中的文件,我已经被困在这一个月,我不知道还能做什么,任何建议都将受到赞赏!

提前谢谢! :)...

2 个答案:

答案 0 :(得分:1)

即使你确定路径存在,我也会在下面的行中添加故障排除并查看它创建的目录结构。

错误表明zip中缺少目录。可能是你正在使用zip等不支持的一些奇怪的文件夹名称。

System.out.println("Coping from:\n\t"+pathOfFile+"\nto\n\t"+pathToSaveInsideZIP);

Files.createDirectories(pathToSaveInsideZIP);  // add this row

Files.copy(pathOfFile, pathToSaveInsideZIP, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Done!!!");

答案 1 :(得分:0)

我建议您试用TrueZip它易于使用,它会将任何存档暴露在虚拟文件系统中,然后您可以轻松地附加,删除或编辑存档中的任何文件。