在java中,Unix环境中的符号链接可以通过比较文件的规范path和绝对path来检测。 但是,这个技巧在windows上不起作用。 如果我执行
mkdir c:\foo mklink /jc:\bar
从命令行,然后在java中执行以下行
File f = new File("C:/bar"); System.out.println(f.getAbsolutePath()); System.out.println(f.getCanonicalPath());
输出是
C:\bar C:\bar
是否有任何检测Windows中的连接点的Java 7以前的方式?
在Java 6或更早的版本中似乎没有任何跨平台的机制,尽管它使用JNA是一个相当简单的任务
interface coreel32 extends Library { public int GetFileAttributesW(WString fileName); } static coreel32 lib = null; public static int getWin32FileAttributes(File f) throws IOException { if (lib == null) { synchronized (coreel32.class) { lib = (coreel32) Native.loadLibrary("kernel32", coreel32.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()
答案是不'。 连接点和符号链接是不一样的事情。 JRE不检查它们,所以你引用的函数不能区分它们。
说完这个,你可以用下面的方法来完成一些事情:
如果联结的目录有内容,那么得到标准路径名的结果可能是“令人惊讶的”,并且显示出情况,因为它可能是联结目标下的路径名。 这只有在结点指向的目录非空时才有效。
你可以尝试这个肮脏的黑客入侵窗户
if (f.isDirectory() || f.isFile()) { System.out.println("File or Directory"); } else { System.out.println("Link"); }