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

2024-04-02

我已按照中的说明进行操作这个线程 https://stackoverflow.com/questions/13787318/java-util-zip-replace-a-single-zip-file,使用其中的代码,我已经能够将文件添加到 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,在代码中由一个名为projectArchiveFile的java.io.File引用,它是我的类的实例变量)包含所有这些文件,当我想处理存档中的某些文件时,我仅将该文件解压缩到一个与我的存档中的结构相同的文件夹(ZIP、projectArchiveFile)中,对该文件夹的引用是 java .io.File 名为 transactionalProjectFolder,也是我的类的实例变量。但给了我这个错误:

应对来自: C:\Dir1\Dir2\Dir3\存档结构的开始\存档结构的另一个文件夹副本\An Excel File.xlsm 到 \存档结构的开始\存档结构的另一个文件夹副本\Excel 文件.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.复制和 Files.move)存档内的文件,我已经被困在这个问题里一个月了,我不知道还能做什么,任何建议将不胜感激!

提前致谢! :)...


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

该错误表明 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!!!");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 zip 中写入(修改或添加)文件 的相关文章

随机推荐

  • MySQL 准备语句 - 如何循环

    我有一个充满 ID 号的表 我需要循环遍历该表 并将其用作准备好的语句中的变量 我不知道是否需要为此使用存储过程 或者常规查询是否可以做到这一点 这是一个简单的例子 SELECT id from var list loop through
  • 创建列表的子类

    我有以下代码 obj lt list list a 4 f 5 g 5 list a 44 f 54 g 54 class obj lt mysubclass class obj 1 class obj 2 class obj 1 2 cl
  • 在jsp中处理浏览器的“后退”按钮

    我有一个jsp搜索页面 Search jsp 和一个结果页面 Result jsp 它们都可以选择搜索条件 然后将参数传递给java控制器文件 Controller java 以构建查询字符串并执行查询搜索 查询字符串和搜索结果将传递到 R
  • 将文件名与文件夹名匹配,然后移动文件

    我有名为 a1 txt a2 txt a3 txt a4 txt a5 txt 等的文件 然后我有名为 a1 1998 a2 1999 a3 2000 a4 2001 a5 2002 等的文件夹 例如 我想在文件 a1 txt 和文件夹 a
  • 当应用程序进入后台时,约束会重置 - iOS 13

    我通常设置了视图的前导 尾随约束 我已将其高度设置为静态 325 对于底部约束 我设置了 2 个约束 1 主视图的底部约束为视图的底部约束 2 主视图的底部约束到视图的顶部约束 现在 根据用户的操作 我仅显示带有动画的隐藏视图 因此 当视图
  • VBA 中的“Dim fso、MyFile、FileName、TextLine”是什么?

    我从这里的一位好人那里收到了这段代码 他们愿意花时间和精力与菜鸟分享他们的知识 Sub ReadLinesFromAFileOneAfterAnother Const ForReading 1 ForWriting 2 ForAppendi
  • iOS 7.0及以上版本的iOS设备的唯一标识

    寻求您的帮助 我在获取时遇到问题设备标识符 实际上我正在使用 UIDevice IdentifierAddition h NSString MD5Addition h 类来获取 Identifier 但其为我的所有设备返回相同的标识符 i
  • symfony 2根据数据库中存储的用户首选项设置区域设置

    我试图根据存储在数据库中的当前用户的首选项来设置区域设置 因此 我们的 User 类有一个 getPreferredLanguage 它返回一个区域设置标识 en fr FR 等 我考虑过以下方法 注册订阅 KernelEvents REQ
  • 在用户拒绝使用定位服务后,如何提示用户打开定位服务

    我有一个具有显式用户交互的应用程序 它利用用户的当前位置 如果用户拒绝访问位置服务 我仍然希望后续使用能够提示用户转到设置并重新启用我的应用程序的位置服务 我想要的行为是内置地图应用程序的行为 在 设置 gt 常规 gt 重置 gt 重置位
  • 绘图中 x 轴上的时间

    我的 x 轴值采用以下格式 May 23 2018 06 31 52 GMT May 23 2018 06 32 02 GMT May 23 2018 06 32 12 GMT May 23 2018 06 32 22 GMT May 23
  • 简单视差、CSS 图层、滚动时显示最后一部分

    我最近在网络世界中看到了一个非常酷的效果 这就是 层次感 用户将向下滚动页面 最后一部分将出现在页面的前几个部分下方 有时它带有图像 但我发现内容也可以这样显示 现在 我已经很熟悉了z index和 CSS 定位 然而 我似乎无法找到正确的
  • Xcode 13.1 bug 将依赖项编辑为本地

    刚刚升级到 Xcode 13 1 并通过单击具有一些依赖项的 Package swift 文件打开了一个 SPM 项目 在以前的版本中 我可以通过将包的本地克隆拖到项目导航器中来简单地编辑这些依赖项之一 然后 Xcode 将忽略签出的依赖项
  • 如何用两种颜色填充绘图上的单个“pch”点?

    如果您采用下面的代码 如何更改第三个菱形的填充 使其变为半黑 半白 该解决方案适用于任何颜色 data lt c 1 2 3 plot data pch c 23 18 23 cex c 2 5 3 2 5 The pch字符是实际的字体符
  • 如何最小化 Flutter Web 版本的大小?是否需要通知文件?

    My web构建 Flutter Web 应用程序后 我的 Flutter Web 应用程序的文件夹大小达到 5 4MB 这还不错 但我不妨优化一下 我想知道是否有人有任何明显的提示 删除不必要的包 之外的提示 以最小化文件大小 我将在 F
  • setcookie 由于标头而无法正常工作 WordPress

    我有一个 WordPress 插件想要创建 cookie 但它不起作用 我真的很感激帮助 add shortcode watchlist cwatchlist short function cwatchlist short echo div
  • htaccess 加载页面 B 而不是页面 A,无需重定向

    使用 htaccess文件 如何加载page B when page A已加载 我不想更改 URL 它仍然应该显示page A 示例 用户负载www mysite com contact并得到结果www mysite com contact
  • bash 中有 do-while 循环吗? [复制]

    这个问题在这里已经有答案了 有没有do whilebash 中循环 我知道如何编程while在 bash 中循环 while condition do body done 是否有类似的构造 但是对于do while循环 其中body至少执行
  • 从应用程序到服务的通信

    我想从我的 Android 应用程序到我的 Android 服务进行通信 我有两个选择 但我不知道该选择哪个 使用应用程序注册服务 使用 LocalBinder 从应用程序连接到服务 解决方案1 应用程序 public class MyAp
  • Apache Cordova/Visual Studio 2015 工具无法在 IOS 模拟器中启动应用程序

    我尝试在 IOS 模拟器上使用 MacInCloud 和 Remotebuild 测试我的应用程序 一切都运行良好 并且应用程序使用 Remotebuild 进行编译 Visual Studio 随后会显示状态 部署成功 当我在 Mac 上
  • 在 zip 中写入(修改或添加)文件

    我已按照中的说明进行操作这个线程 https stackoverflow com questions 13787318 java util zip replace a single zip file 使用其中的代码 我已经能够将文件添加到