【问题标题】:Java: `A` Archive attribute missing while creating zip programmaticallyJava:以编程方式创建 zip 时缺少“A”存档属性
【发布时间】:2016-01-14 06:01:56
【问题描述】:

我们正在处理使用属性来检查 zip 中是否存在目录/文件的解压缩库/实用程序。

问题是我们无法在创建时为 zip 设置存档位。当我们以编程方式创建 zip 时,它也会清除以前的属性。

我们将尝试使用下面提到的步骤设置存档位,但到目前为止没有得到想要的结果:

1. Parse each zip entry and getExtra byte[].
2. Use Int value=32 and perform bitwise 'OR' operation.
3. setExtra byte[] after 'OR' operation.

添加更多细节: 我们尝试了以下方法,但仍然没有解决这个问题。

  1. 在文件系统上使用 setAttribute() 方法,但在创建 zip 时获取属性会被重置。 Files.setAttribute(file, “dos:archive”, true)

  2. 使用File.copy() 将与文件关联的文件属性复制到目标文件但没有成功。甚至现有属性也不会保留到目标文件中。 Files.copy(path, path, StandardCopyOption.COPY_ATTRIBUTES)

  3. 使用ZipEntry.setExtra(byte[])。 在网上找到一些信息,java没有任何直接设置属性的方法,但根据一些在线文章,我们发现额外字段用于设置unix和MS DOS文件属性的文件权限。这是一个未记录的领域,我们在网上没有找到任何可靠的信息。基本上,最初的 2 个字节用于 unix,最后 2 个字节用于 DOS 文件属性。我们尝试在其中设置具有不同值的 DOS 文件属性。 ZipEntry.setExtra(byte[]) - 为条目设置可选的额外字段数据。

  4. 使用 winzip 命令行工具,但不是一个优雅的解决方案。

【问题讨论】:

    标签: java zip zipfile 7zip


    【解决方案1】:

    我假设它是 DOS (Windows)

    使用 Java 7

    import java.nio.file.Files;
    import java.nio.file.Path;
    
    File theFile = new File("yourfile.zip");
    Path file = theFile.toPath();
    Files.setAttribute(file, "dos:archive", true);
    

    见:http://kodejava.org/how-do-i-set-the-value-of-file-attributes/

    【讨论】:

    • 我们已经尝试过了,但没有成功。 Files.setAttribue() 适用于文件系统,但在创建 zip 时,zip 实用程序会清除属性标志。需要有关如何在 zip 系统上设置存档/额外属性的信息。问题是在创建 zip 时,文件属性被重置。
    • 我不明白。此功能在您的系统上是否有效? 1它独立于zip。 2 并且您必须在创建 zip 文件后执行此操作(在 = 全部关闭之后)。如果它不起作用,您的操作系统还有另一个问题(不可写目录?)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多