在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中的联结?
答案 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");
}