首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JDK 5 api从zip文件提取时保持文件权限

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

Stack Overflow用户
提问于 2009-06-26 18:32:24
回答 4查看 12.2K关注 0票数 21

我正在使用java.util.Zip和java.util.ZipEntry成功地将压缩文件的内容附加到磁盘。我希望保留在*nix文件系统上提取时设置的文件权限。

有谁能告诉我做这件事的正确方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-16 01:36:42

从本质上讲,您不能在Zip/Jar文件中存储(unix)文件权限,因此在解压jar时不能保留它们(在开始创建jar时,它们已经丢失)。请看这个问题:creating a jar file - preserving file permissions

如果您需要在归档中保留文件权限并在提取时恢复,则需要考虑替代的.tar或.tar.gz / .tar.bz2格式,这也是大多数Java构建工具(Ant、Gradle、Maven...)原生支持的格式。

票数 -1
EN

Stack Overflow用户

发布于 2010-03-12 19:54:59

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

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

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

也就是说,Java6有一个新的java.io.File class,它允许您设置权限(使用setExecutable()、setReadable()等方法)

这些对我帮助很大,特别是setExecutable(),当我不得不在Linux文件系统上解压可执行文件时,它是我主要关心的。你也不必费心弄清楚你是在什么操作系统上运行的,因为如果在Windows或其他没有可执行文件概念的系统上运行,这个方法什么也做不了。

票数 10
EN

Stack Overflow用户

发布于 2021-04-02 18:04:34

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

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

Files.setPosixFilePermissions(path, PermissionUtils.permissionsFromMode(entry.getUnixMode()));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1050560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档