如何使用 Zip4J API 添加具有指定文件权限的流数据

How do you use the Zip4J API to add streamed data with specified file permissions

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

ZipFile.addStream(InputStream stream, ZipParameters pars)

似乎没有在 ZipFile 或 ZipParameter classes 的实例上指定 'file permissions' 或 'default file permissions' 的方法。

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

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

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

附加信息

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

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

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 class 的应用 posix 文件属性中找到的。

潜在的解决方法(我正在努力避免)

我看到的一种解决方法是将流中的数据写入临时文件,确保该文件具有所需的权限,将文件添加到 zip 存档,然后删除临时文件(因为它已提供它的目的)。这种方法假定磁盘文件权限得到正确维护,在 'posix system'.

上似乎就是这种情况。

我不想使用这种方法。

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