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

В 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?

Ответы [ 3 ]

8 голосов
/ 20 июля 2010

В 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 голос
/ 18 июля 2010

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

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

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

0 голосов
/ 19 июля 2010

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

    if (f.isDirectory() || f.isFile()) {
        System.out.println("File or Directory");
    } else {
        System.out.println("Link");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...