欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-27 22:20:55
...
在 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 异常。

文章来源:http://www.aptusource.org/2014/04/nio-2-creating-a-symbolic-link/