В Java символьная ссылка в среде Unix может быть обнаружена путем сравнения канонического и полного пути файла. Однако этот прием не работает над окнами. Если я выполняюсь
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 способов обнаружить соединение в окнах?
Похоже, что в 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);
}
EDIT: обновлено для каждого комментария о возможном возврате ошибки с помощью getWin32FileAttributes ()
Ответ - «нет». Точки соединения и символические ссылки - это не одно и то же. JRE не проверяет их, поэтому функции, которые вы цитируете, не различают их.
Сказав это, вы можете чего-то добиться с помощью следующего:
Если соединенный каталог имеет содержимое, то результат получения канонического пути к чему-то внизу может быть «неожиданным» и раскрыть ситуацию, поскольку он скорее всего, это путь к цели соединения. Это работает, только если каталог, на который указывает соединение, конечно, не пуст.
Вы можете попробовать этот грязный хак для Windows
if (f.isDirectory() || f.isFile()) {
System.out.println("File or Directory");
} else {
System.out.println("Link");
}