Java 1.6-确定符号链接

Java 1.6-确定符号链接,java,java-6,Java,Java 6,在DirectoryWalker类中,我想知道文件实例是否实际上是指向目录的符号链接(假设walker在UNIX系统上行走)。假设我已经知道实例是一个目录,那么下面的条件是否是确定符号链接的可靠条件 File file; // ... if (file.getAbsolutePath().equals(file.getCanonicalPath())) { // real directory ---> do normal stuff } else {

在DirectoryWalker类中,我想知道文件实例是否实际上是指向目录的符号链接(假设walker在UNIX系统上行走)。假设我已经知道实例是一个目录,那么下面的条件是否是确定符号链接的可靠条件

File file;
// ...      
if (file.getAbsolutePath().equals(file.getCanonicalPath())) {
    // real directory ---> do normal stuff      
}
else {
    // possible symbolic link ---> do link stuff
}

Java 1.6不提供对文件系统的这种低级访问。看起来,应该包含在Java1.7中,它将支持符号链接。有空。符号链接,它们是可能的。我不确定应该使用哪种方法来确定文件是否是符号链接。讨论NIO 2是有必要的——也许他们会知道。

它看起来可以做其他事情,使它与绝对路径不同

此方法首先在必要时将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以依赖于系统的方式将其映射到其唯一形式。这通常涉及从路径名中删除冗余名称,例如“.”和“.”,解析符号链接(在UNIX平台上),以及将驱动器号转换为标准大小写(在Microsoft Windows平台上)


但它可能适用于您的绝大多数用例;您的里程可能会有所不同。

Apache Commons中使用的技术使用父目录的规范路径,而不是文件本身。我认为您不能保证不匹配是由于符号链接造成的,但这很好地表明文件需要特殊处理

这是(取决于),修改为紧凑

public static boolean isSymlink(File file) throws IOException {
  if (file == null)
    throw new NullPointerException("File must not be null");
  File canon;
  if (file.getParent() == null) {
    canon = file;
  } else {
    File canonDir = file.getParentFile().getCanonicalFile();
    canon = new File(canonDir, file.getName());
  }
  return !canon.getCanonicalFile().equals(canon.getAbsoluteFile());
}

很抱歉回复这么老的帖子,但我在寻找Windows系统的解决方案,之前的一些答案对我来说并不合适。如果您不关心跨平台兼容性,只需要针对Windows的解决方案,那么以下技术在我看来非常有效

File f = new File("whatever file or folder");
if (f instanceof ShellFolder) {
  ShellFolder sf = (ShellFolder)f;
  if (sf.isLink()) {
    // Your code when it's a link
  }
}

我想在处理这个问题时,我会分享我的一些好运。我使用的是JDK1.6.023,因此我无法从NIO2中获益。我在Windows 7/x64上构建和运行,只是为了在其他环境中里程可能有所不同。不幸的是,这里的其他解决方案在避免试图遍历连接时引起的NullPointerException方面对我不起作用(可能是因为连接!=symlink…)。虽然我不受JDK版本的限制,但我决定将这个问题保持更长的时间

我有这段代码,如果在符号链接上使用或遇到“系统卷信息”目录,将导致NullPointerException。(注意,traverseItem.f()返回java.io.File类型的对象)

因此,它应该是一个目录,但对其调用listFiles()会导致NPE。怎么办?我发现了list()方法,想知道它是否会表现出同样的行为。我发现的是:

对描述空文件夹的文件调用list()将返回长度为零的字符串[]数组。但是,对描述连接的文件调用list(),否则会从listFiles()崩溃,返回null

通过在调用listFiles()之前添加以下测试,我能够避免NullPointerException


仍然需要对连接、符号链接、硬链接以及我敢说的快捷方式的所有情况进行详尽的测试,但这可能会有所帮助。

此外,还要注意
file.isFile()
file.isDirectory()
文件
引用了一个不存在目标的符号链接时,两个返回结果都基于已解析的文件,因此都返回
false


(我知道这本身并不是一个有用的答案,但有几次我被它绊倒了,所以我想我应该与大家分享)

如果您已经为*nix编写了一些专门的代码,那么您可以从Java执行一个shell命令,如下所示:

Process p = Runtime.getRuntime().exec(new String[]{"test", "-h", yourFileName});
p.waitFor();
if (p.exitValue() == 0) 
   System.out.println("This file is a symbolic link");
else
   System.out.println("This file is not a symbolic link");

这对于*nix来说是非常特殊的,但它至少能起作用。

嗯,格雷和埃里克森:事实上,即使它链接到同一目录中的文件,它也能正常工作。您是否有一个单元测试来说明您的观点?这在使用NTFS的Windows上不起作用(当使用mklink创建symlink时)。与Java 1.7相关:-更多关于我自己的说明-我一直回到这里
ShellFolder
似乎是
sun.awt.shell.ShellFolder
中的
rt.jar
我认为“new File()”不会动态生成ShellFolder的实例。这是FileChoser的结果,我从来没有考虑过这种情况。说得好。你的解释到处都是,在大多数地方看起来几乎完全不相关,在其他地方大部分是不准确的,而且你的代码片段非常不完整。如果可以的话,我会投两张反对票。
    String[] contents = traverseItem.f().list();
    if (contents != null) {  //Non-traversible if null, possibly junction or ???
Process p = Runtime.getRuntime().exec(new String[]{"test", "-h", yourFileName});
p.waitFor();
if (p.exitValue() == 0) 
   System.out.println("This file is a symbolic link");
else
   System.out.println("This file is not a symbolic link");