2016-12-05 174 views
1

我创建了一个包含文件列表的符号链接文件夹。有没有办法将符号链接转换为使用java的HardLink?隐藏符号链接文件夹到硬链接文件夹

+2

你为什么要这样做?硬链接很少是一个好主意。 –

+0

您是否阅读过https://docs.oracle.com/javase/tutorial/essential/io/links.html? – 2016-12-05 07:43:50

+0

@Eli sadoff要求就是这样。三个文件夹source-temp-destination。源到他们需要使用符号链接的温度。一旦最终修改完成。他们需要将临时文件夹中的文件移动到目标位置并删除临时文件夹。 –

回答

0

若要用java硬链接,你可以使用:

Path newLink = ...; 
Path existingFile = ...; 
try { 
    Files.createLink(newLink, existingFile); 
} catch (IOException x) { 
    System.err.println(x); 
} catch (UnsupportedOperationException x) { 
    // Some file systems do not 
    // support adding an existing 
    // file to a directory. 
    System.err.println(x); 
} 

所以,你的情况newLink应该是你创建的oldSymbolicLinkexistingFile表示其目标。

获取符号链接的目标,你可以使用

Files.readSymbolicLink(oldSymbolicLink)); 

甲骨文文件:Links, Symbolic or Otherwise

+0

如果我们从符号链接文件夹创建硬链接,它将无法正常工作,对吧? –

0

Java doc由别人指出说,在目录硬链接不能创建。所以,我不会告诉你如何创建目录的硬链接,而是要解释为什么你不能在目录上创建硬链接。

当您尝试遍历目录树时,硬链接在目录上会导致循环。

例如,如果你有一个目录/foo/bar和符号链接/foo/bar/baz指向../bar,当您尝试遍历这棵树,你会遇到一个无限循环。现在

/foo/ 
/foo/bar 
/foo/bar/baz 
/foo/bar/baz/bar 
/foo/bar/baz/bar/baz 
... 

,如果baz是一个符号链接../bar,它是简单的使用unlink(2)系统调用(因为取消链接不跟随符号连接)断开链接baz修复。但是,如果baz是一个硬链接,那么这将是很多harder(没有双关语意图)来解决这个问题。在“Unix环境下的高级编程”一书中,Stephen Rago指出Rich Stevens在尝试这个实验时损坏了他的文件系统(并且fsck无法恢复)