[NIO.2] 第二十一篇 创建软链接

在 NIO.2 中,创建软链接非常简单,只需要调用 Files.createSymbolicLink() 方法即可。这个方法需要传入软链接和目标文件的 Path 对象,并且可以传入一组文件属性,返回软链接的 Path 对象。

如果你的文件系统不支持软链接,那么将会抛出 UnsupportedOperationException 异常。记住,目标文件可以使用绝对路径也可以使用相对路径来定义,并且目标文件本身可以存在也可以不存在。

下面的代码将会简单创建一个拥有默认属性的软链接。软链接名为 rafael.nadal.1 目标文件文件为 C:\rafaelnadal\photos\rafa_winner.jpg:


Path link = FileSystems.getDefault().getPath("rafael.nadal.1");
Path target= FileSystems.getDefault().getPath("C:/rafaelnadal/photos", "rafa_winner.jpg");

try {
Files.createSymbolicLink(link, target);
} catch (IOException | UnsupportedOperationException | SecurityException e) {
if (e instanceof SecurityException) {
System.err.println("Permission denied!");
}
if (e instanceof UnsupportedOperationException) {
System.err.println("An unsupported operation was detected!");
}
if (e instanceof IOException) {
System.err.println("An I/O error occurred!");
}
System.err.println(e);
}


当你需要改变软链接的默认属性时,可以使用 createSymbolicLink 方法的第三个参数,这个参数的类型是 FileAttribute - 这个对象将封装一系列的文件属性供创建软链接的时候使用。下面的代码将演示如何从目标文件读取文件属性,并且将目标文件的文件属性设置到新创建的软链接上。新创建的软链接名为 rafael.nadal.2 目标文件是 C:\rafaelnadal\photos\rafa_winner.jpg:


Path link = FileSystems.getDefault().getPath("rafael.nadal.2");
Path target = FileSystems.getDefault().getPath("C:/rafaelnadal/photos", "rafa_winner.jpg");

try {
PosixFileAttributes attrs = Files.readAttributes(target, PosixFileAttributes.class);
FileAttribute<Set> attr =
PosixFilePermissions.asFileAttribute(attrs.permissions());

Files.createSymbolicLink(link, target, attr);
} catch (IOException | UnsupportedOperationException | SecurityException e) {
if (e instanceof SecurityException) {
System.err.println("Permission denied!");
}
if (e instanceof UnsupportedOperationException) {
System.err.println("An unsupported operation was detected!");
}
if (e instanceof IOException) {
System.err.println("An I/O error occured!");
}
System.err.println(e);
}


另外,也可以使用 setAttribute() 方法来更改文件属性。例如,下面的代码将读取目标文件的 lastModifiedTime 和 lastAccessTime 属性,并将这两个属性设置到新创建的软链接上。新创建的软链接名为 rafael.nadal.3,目标文件是 C:\rafaelnadal\photos\rafa_winner.jpg:


Path link = FileSystems.getDefault().getPath("rafael.nadal.3");
Path target = FileSystems.getDefault().getPath("C:/rafaelnadal/photos", "rafa_winner.jpg");

try {
Files.createSymbolicLink(link, target);

FileTime lm = (FileTime) Files.getAttribute(target,
"basic:lastModifiedTime", NOFOLLOW_LINKS);
FileTime la = (FileTime) Files.getAttribute(target,
"basic:lastAccessTime", NOFOLLOW_LINKS);
Files.setAttribute(link, "basic:lastModifiedTime", lm, NOFOLLOW_LINKS);
Files.setAttribute(link, "basic:lastAccessTime", la, NOFOLLOW_LINKS);
} catch (IOException | UnsupportedOperationException | SecurityException e) {
if (e instanceof SecurityException) {
System.err.println("Permision denied!");
}
if (e instanceof UnsupportedOperationException) {
System.err.println("An unsupported operation was detected!");
}
if (e instanceof IOException) {
System.err.println("An I/O error occured!");
}
System.err.println(e);
}


注:如果软链接已经存在,那么在创建软链接的时候会抛出 FileAlreadyExistsException 异常。

文章来源:[url]http://www.aptusource.org/2014/04/nio-2-creating-a-symbolic-link/[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值