0

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 系统”上似乎就是这种情况。

我宁愿不使用这种方法。

4

1 回答 1

0

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

于 2020-11-25T19:44:41.847 回答