代码之家  ›  专栏  ›  技术社区  ›  Jherico

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

  •  8
  • Jherico  · 技术社区  · 14 年前

    在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
    

    3 回复  |  直到 14 年前
        1
  •  8
  •   Jherico    12 年前

    在Java6或更早版本中似乎没有任何跨平台的机制来实现这一点,尽管使用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()

        2
  •  1
  •   bmargulies    14 年前

    话虽如此,你也许可以通过以下几点来完成一些事情:

    如果连接目录包含内容,那么将某个对象的规范路径名放在它下面的结果可能会是“令人惊讶”的,并且会揭示这种情况,因为它很可能是连接目标下的路径名。当然,只有当连接点指向的目录是非空的时,这才有效。

        3
  •  -1
  •   Manish Singh    14 年前

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