Кросс-платформенный способ обнаружить символьную ссылку / точка соединения?

В 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 способов обнаружить соединение в окнах?

8
задан Jherico 14 July 2010 в 18:13
поделиться

3 ответа

Похоже, что в 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 ()

8
ответ дан 5 December 2019 в 20:13
поделиться

Ответ - «нет». Точки соединения и символические ссылки - это не одно и то же. JRE не проверяет их, поэтому функции, которые вы цитируете, не различают их.

Сказав это, вы можете чего-то добиться с помощью следующего:

Если соединенный каталог имеет содержимое, то результат получения канонического пути к чему-то внизу может быть «неожиданным» и раскрыть ситуацию, поскольку он скорее всего, это путь к цели соединения. Это работает, только если каталог, на который указывает соединение, конечно, не пуст.

1
ответ дан 5 December 2019 в 20:13
поделиться

Вы можете попробовать этот грязный хак для Windows

    if (f.isDirectory() || f.isFile()) {
        System.out.println("File or Directory");
    } else {
        System.out.println("Link");
    }
-1
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: