我正在使用java.util.Zip和java.util.ZipEntry成功地将压缩文件的内容附加到磁盘。我希望保留在*nix文件系统上提取时设置的文件权限。
有谁能告诉我做这件事的正确方法吗?
发布于 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...)原生支持的格式。
发布于 2010-03-12 19:54:59
我认为正确地保留权限实际上是不可能的。
权限非常特定于操作系统: POSIX文件权限允许用户为文件所有者、组和其他人设置您是否可以读取、写入或执行文件,而NTFS文件系统具有类似的系统,但不存在执行权限的概念。和早期的FAT/FAT32文件系统,根本没有文件权限(只读属性的一部分)。
由于是跨平台的,java很难根据底层操作系统正确地设置新创建(解压缩)的文件的权限。
也就是说,Java6有一个新的java.io.File class,它允许您设置权限(使用setExecutable()、setReadable()等方法)
这些对我帮助很大,特别是setExecutable(),当我不得不在Linux文件系统上解压可执行文件时,它是我主要关心的。你也不必费心弄清楚你是在什么操作系统上运行的,因为如果在Windows或其他没有可执行文件概念的系统上运行,这个方法什么也做不了。
发布于 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()));
https://stackoverflow.com/questions/1050560
复制相似问题