跨平台方式检测符号链接/连接点?

时间:2010-07-14 18:13:22

标签: java windows cross-platform

在java中,可以通过比较文件的规范路径和绝对路径来检测Unix环境中的符号链接。但是,这个技巧在Windows上不起作用。如果我执行

mkdir c:\foo
mklink /j c:\bar
从命令行

然后在java

中执行以下行
File f = new File("C:/bar");
System.out.println(f.getAbsolutePath());
System.out.println(f.getCanonicalPath());

输出

C:\bar
C:\bar

是否有任何Java 7之前的方法来检测Windows中的联结?

3 个答案:

答案 0 :(得分:8)

在Java 6或更早版本中似乎没有任何跨平台机制,尽管它是一个使用JNA的相当简单的任务

interface Kernel32 extends Library {
  public int GetFileAttributesW(WString fileName);
}

static Kernel32 lib = null;
public static int getWin32FileAttributes(File f) throws IOException { 
  if (lib == null) {
    synchronized (Kernel32.class) {
      lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
    }
  }
  return lib.GetFileAttributesW(new WString(f.getCanonicalPath()));
}

public static boolean isJunctionOrSymlink(File f) throws IOException {
  if (!f.exists()) { return false; }
  int attributes = getWin32FileAttributes(f);
  if (-1 == attributes) { return false; }
  return ((0x400 & attributes) != 0);
}

编辑:根据getWin32FileAttributes()

可能出现的错误回复的每条评论进行更新

答案 1 :(得分:1)

答案是'不'。连接点和符号链接不是同一类。 JRE不会检查它们,因此您引用的功能不会区分它们。

话虽如此,您可以通过以下方式完成某些事情:

如果联结目录有内容,那么获取低于它的某些规范路径名的结果可能是“令人惊讶的”并揭示情况,因为它很可能是联结目标下的路径名。这仅适用于联结所指向的目录当然是非空的。

答案 2 :(得分:-1)

你可以试试这个脏黑客的窗户

    if (f.isDirectory() || f.isFile()) {
        System.out.println("File or Directory");
    } else {
        System.out.println("Link");
    }