使用 JDK 5 api 从 zip 文件提取时维护文件权限

2022-09-02 04:36:44

我正在使用java.util.Zip和java.util.ZipEntry成功地将zip文件的内容添加到磁盘。我想在*nix文件系统上提取时维护文件权限集。

任何人都可以指出我这样做的“正确”方法吗?


答案 1

我认为实际上不可能正确保留权限。

权限非常特定于操作系统:POSIX文件权限允许用户为文件所有者,组和其他人设置是否可以读取,写入或执行文件,NTFS文件系统具有类似的系统,但执行权限的概念不存在。而早期的 FAT/FAT32 文件系统,根本没有文件权限(只读属性的一部分)。

作为跨平台的,java很难根据底层操作系统在新创建(解压缩)的文件上正确设置权限。

也就是说,Java 6有一个新的java.io.File类,允许您设置权限(使用setExecutable(),setReadable()等方法。

这些帮助了我很多,特别是setExecutable(),这是我在Linux文件系统上解压缩可执行文件时主要关心的问题。而且您不必费心弄清楚您正在运行的操作系统,因为如果没有可执行文件的概念,该方法在Windows或其他系统下运行,则只会做任何事情。


答案 2

unix权限存储在zip中,可以在条目外部属性中,也可以存储在额外的字段中(使用“Asi”额外字段,用0x756E id标记)。 公开额外的字段,如果存在 Asi 字段,则可以读取该字段,但外部属性不可访问。因此,不可能在所有情况下仅使用 JDK zip 实现来还原文件权限。java.util.zip.ZipEntry

幸运的是,Apache Commons Compress项目有自己的ZipFile实现,它解析外部属性,权限通过ZipArchiveEntry.getUnixMode()方法公开。然后,使用 Ant 的 PermissionUtils 类和 Java NIO API,可以将权限应用回提取的文件:

Files.setPosixFilePermissions(path, PermissionUtils.permissionsFromMode(entry.getUnixMode()));

推荐