【问题标题】:How do you use the Zip4J API to add streamed data with specified file permissions如何使用 Zip4J API 添加具有指定文件权限的流式数据
【发布时间】:2020-08-10 11:59:51
【问题描述】:

Zip4J API 提供了一种将流式条目添加到 zip 文件的便捷方法:

ZipFile.addStream(InputStream stream, ZipParameters pars)

似乎没有在 ZipFile 或 ZipParameter 类的实例上指定“文件权限”或“默认文件权限”的方法。

默认行为是将条目上的所有文件属性设置为 false,这在 unix 系统上意味着没有所有者、组和其他的读取、写入或执行权限。这很不方便。我想至少为所有者设置读取权限标志。

  1. 是否有一种方法可以设置“流式” zip 文件条目的文件权限(即使用 ZipFile.addStream 方法添加的条目?

  2. 如果不是 (1),是否有一种方法可以在创建条目后添加文件权限(实际上存储在磁盘上的基础 zip 文件中 - 请参阅有关此警告的其他信息)?

其他信息

注意,一旦将流条目添加到 Zip 文件中,就可以从其标题数据中获取和设置文件属性信息,这可以使用 ZipFile.getHeader(entryName) 方法获得。但是,使用此 API 设置文件权限值不会直接影响基础 zip 文件。此外,似乎无法将更新后的标头信息保存到磁盘(尽管我可能遗漏了一些东西)。

获取和设置文件属性的方法参考如下:

byte[] FileHeader.getInternalFileAttributes()
void   FileHeader.setInternalFileAttributes(byte[] attributes)
byte[] FileHeader.getExternalFileAttributes()
void   FileHeader.setExternalFileAttributes(byte[] attributes)

深入zip4j代码,表明这些文件属性存储在一个4字节的数组中,其中字节2和3(从字节0开始)中的位表示unix文件权限位。这可以在 net.lingala.zip4j.util.FileUtils 类的应用 posix 文件属性中找到。

潜在的解决方法(我试图避免)

我可以看到的一种解决方法是将流中的数据写入临时文件,确保该文件具有所需的权限,将文件添加到 zip 存档,然后删除临时文件(因为它已经达到了它的目的)。这种方法假定磁盘文件权限得到正确维护,在“posix 系统”上似乎就是这种情况。

我不想使用这种方法。

【问题讨论】:

    标签: java zip4j


    【解决方案1】:

    我遇到了同样的错误,我使用的是 2.6.1 版本,然后我发现了这个问题: Unix permissions are messed up 它已针对 2.6.2 及更高版本进行了修复。 在 Linux Box 中运行时只需添加标准权限,而不是让您作为用户更改这些权限。 检查该版本是否对您有用。

    【讨论】:

    • 验证 Hugo Mtz 观察到 Zip4J 版本 2.6.2 确实有一个错误修复,说它修复了在“Unix”系统上创建时添加流数据的文件权限。我已经在 Linux 系统上下载并测试了 Zip4J 2.6.4,并且添加的流文件现在已经设置了所有者读写权限。这对我的用例来说已经足够了,但不能让您指定所需的文件权限。还要检查当 Zip4J 用于在 Windows 系统上添加流数据时会发生什么,然后在 Unix 系统上处理。
    最近更新 更多