java 文件编码unix_java – 处理Windows文件系统上的unix符号链接文件

我目前正在开发一个Java项目,该项目应该允许用户导出与Windows软件(.exe)或OS X app(.app)捆绑在一起的项目,以将数据分发到其他工作站. Windows和OS X软件都存储为压缩zip文件,并在导出项目时解压缩.我的问题是在Windows上解压缩OS X应用程序打破了捆绑框架内的符号链接.反过来,这会破坏应用程序的签名,并在OS X上启动应用程序时导致问题.

我正在使用Apache Commons压缩库解压缩包,这使我能够检测符号链接及其目标.使用OS X,我能够使用java.nio.file.Files中的方法重新创建符号链接,但是对于Windows,这将需要管理员权限,我有点犹豫要添加作为使用该软件的先决条件(即使启用我也不相信这会起作用 – 没试过).

我对链接被破坏的原因有一点了解,但如果我理解正确,Windows文件系统不包括对Unix符号链接的文件类型的支持,因此链接被解压缩为普通文件,将不再在OS X上打开时被识别为符号链接.

所以,我的问题是,我能以某种方式将符号链接文件按位按位复制到Windows文件系统,保留Unix特定位或者保留这些信息是不可能的吗?或者我应该只更改导出方法以将项目文件添加到现有的zip文件,在这种情况下,可能会保留符号链接信息,直到在目标计算机上解压缩zip?

在ZipFile的每个ZipArchiveEntry上循环的当前代码如下:

byte data[] = new byte[BUFFER];

Enumeration entries = zipFile.getEntries();

while (entries.hasMoreElements()) {

ZipArchiveEntry zipEntry = entries.nextElement();

String destFilename = copyFolder + zipEntry.getName();

File destFile = new File(destFilename);

if (zipEntry.isUnixSymlink()) {

File target = new File(zipFile.getUnixSymlink(zipEntry));

try {

// Try to create symbolic link - currently only works with OS X

Files.createSymbolicLink(destFile.toPath(), target.toPath());

continue;

} catch (Exception e) {

System.out.println("Failed to create symbolic link: " +

destFile.getAbsolutePath() + " -> " +

target.getAbsolutePath());

}

}

// If file

int count;

FileOutputStream fos = new FileOutputStream(destFile);

try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) {

InputStream is = zipFile.getInputStream(zipEntry);

while ( (count = is.read(data, 0, BUFFER)) != -1) {

dest.write(data, 0, count);

}

}

}

解决方法:

Windows文件系统使用与UNIX类似的方法来定义符号链接(如硬链接或软链接),但它们不是100%兼容的.你可以在这里阅读更多相关信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365680(v=vs.85).aspx

你问的简单答案 – 你不能只是按位复制链接以获得相同的Unix特定位,因为Windows NTFS只是没有它们. JAVA也设计为在沙箱中工作,因此您无法访问系统低级API以“制作”您想要的任何内容.我不会用JAVA去做这样的系统特定任务.可能你不必.

取决于您在此项目中的角色,您可以重新定义应包含的包.你真的需要里面的符号链接吗?可能更普遍的是有一些将不同部分映射在一起的“属性”文件?或者将其作为数据库分发?尽量不要依赖于系统特定的实现.

标签:java,windows,symlink,macos,zipfile

来源: https://codeday.me/bug/20190611/1218437.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、UNIX文件系统的基本原理        UNIX采用树型目录结构,每个目录表称为一个目录文件。一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。本次课程设计是要实现一个简单的模拟UNIX文件系统。我们在磁盘中申请一个二进制文件模拟UNIX内存,依次初始化建立位示图区,I节点区,数据块区。 二、基本要点思路         1、模拟磁盘块的实现:因为文件系统需要从磁盘中读取数据操作数据,在实现时是使用文件来模拟磁盘,一个文件是一块磁盘,在文件中以划分磁盘块那样划分不同的区域,主要有三个区域:位图区,inode索引节点区,磁盘块区。位图区我是使用一个512byte的数组存放,inode区和磁盘块区我采用一种自认为比较巧妙的方法,就是存放对象列表,之前说过,在本次实验的所有的结构都使用对象进行存储,而inode节点和磁盘块就是两个重要的数据结构,在初始化时我实例化32个inode对象和512个block对象(至于这些类的具体定义下面会提到),然后将这些对象加入各自对应的对象列表中,在存储时,使用java的对象序列化技术将这个对象数组存到磁盘中。当使用文件系统时,程序会先从磁盘文件中读取出位图数组,inode对象列表,block对象列表,之后的操作就是通过对这些列表进行修改来实现。使用这种方法可以减小存储的空间(对象序列话技术)而且不需要在使用时进行无用的查找,只要第一次初始化中将这些对象都读取出来。        2、界面的实现:在实现这个文件系统时使用了两种方案,一种是直接在java控制台来进行输入输出,因为原本想着UNIX文件系统原本也是使用的命令行语句,所以在控制台上实现也很接近。后来在老师的建议下又将整个程序重新修改,改成在UI界面上进行输入输出,这样确实界面美观舒服了不少,只不过两者用的技术很不一样,前者主要使用的是系统的输入输出流,后者使用java监听器。        3、权限的实现:在实现多用户的权限方面,我给文件文件夹各定义了三级权限1、访问:在文件中是可以查看文件的内容,在文件夹中是可以进入该文件夹。2、修改:文件中是可以对文件进行编辑,文件夹中是可以在该文件夹中创建新的文件或目录。3、删除:顾名思义。文件文件夹的创建者拥有最高级别的权限,只有拥有最高级权限的用户才可以给其他用户针对该文件文件夹进行授权和授权操作。在每次对文件文件夹进行访问修改删除操作时都会检查当前用户在该文件文件夹所拥有的权限,只有拥有的权限大于想要实现的权限时才可以进行该操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值