使用JDK 5 api从zip文件中提取时保持文件权限

Ray*_*ker 19 java io zip

我正在使用java.util.Zip和java.util.ZipEntry成功地将zip文件的内容添加到磁盘.我想在*nix文件系统上解压缩时保持设置的文件权限.

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

dm7*_*m76 10

我认为实际上无法正确保留权限.

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

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

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

这些对我帮助很大,尤其是setExecutable(),这是我在Linux文件系统上解压缩可执行文件时的主要关注点.而且你不必费心去弄清楚你在运行什么操作系统,因为如果在没有可执行文件概念的情况下在Windows或其他系统下运行,该方法将无能为力.


Emm*_*urg 5

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

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

Files.setPosixFilePermissions(path, PermissionUtils.permissionsFromMode(entry.getUnixMode()));
Run Code Online (Sandbox Code Playgroud)


Pat*_* M. 0

本质上,您无法在 Zip/Jar 文件中存储 (unix) 文件权限,因此在提取 jar 时无法保留它们(在创建 jar 时它们就丢失了)。请参阅这个问题:创建 jar 文件 - 保留文件权限

如果您需要在存档中保留文件权限并在解压时恢复,则需要考虑替代的 .tar 或 .tar.gz / .tar.bz2 格式,大多数 Java 构建工具(Ant、Gradle、马文...)