[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 异常。

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

你可能感兴趣的:(NIO.2)