Как реализовать "mklink / H" (hardlinking) в Java? - PullRequest
3 голосов
/ 20 декабря 2011

Я хочу создать жесткую ссылку из файла «C: \ xxx.log» на «C: \ mklink \ xxx.log». В cmd это работает, конечно, но я хочу написать программное обеспечение для этого варианта использования.

  • Так что нужно найти существующий файл
  • Тогда сделайте жесткую ссылку
  • Затем удалите старый файл

Я начал реализовывать, но я просто знаю, как создать файл. В Google я ничего не нашел о mklink \ H для Java.

public void createFile() {
     boolean flag = false;

     // create File object
     File stockFile = new File("c://mklink/test.txt");

     try {
         flag = stockFile.createNewFile();
     } catch (IOException ioe) {
          System.out.println("Error while Creating File in Java" + ioe);
     }

     System.out.println("stock file" + stockFile.getPath() + " created ");
}

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

Есть 3 способа создать жесткую ссылку в JAVA.

  1. JAVA 1.7 Поддерживает жесткие ссылки.

    http://docs.oracle.com/javase/tutorial/essential/io/links.html#hardLink

  2. JNA, JNA позволяет выполнять собственные системные вызовы.

    https://github.com/twall/jna

  3. JNI, вы можете использовать C ++ для создания жесткой ссылки и затем вызывать ее через JAVA.

Надеюсь, это поможет.

1 голос
/ 20 декабря 2011

Ссылка (мягкая или жесткая) - это функция ОС, которая не предоставляется стандартным API Java. Я бы посоветовал вам запустить команду mklink /h из Java, используя Runitme.exec() или ProcessBuilder.

Или попробуйте найти сторонний API, который оборачивает это. Также проверьте, что нового в Java 7. К сожалению, я не знаком с этим, но я знаю, что они добавили богатый API файловой системы.

0 голосов
/ 15 февраля 2014

Для потомков я использую следующий метод для создания ссылок на * nix / OSX или Windows. В windows mklink /j создает «соединение», которое похоже на символическую ссылку.

protected void makeLink(File existingFile, File linkFile) throws IOException {
    Process process;
    String unixLnPath = "/bin/ln";
    if (new File(unixLnPath).canExecute()) {
        process =
                Runtime.getRuntime().exec(
                        new String[] { unixLnPath, "-s", existingFile.getPath(), linkFile.getPath() });
    } else {
        process =
                Runtime.getRuntime().exec(
                        new String[] { "cmd", "/c", "mklink", "/j", linkFile.getPath(), existingFile.getPath() });
    }
    int errorCode;
    try {
        errorCode = process.waitFor();
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new IOException("Link operation was interrupted", e);
    }
    if (errorCode != 0) {
        logAndThrow("Could not create symlink from " + linkFile + " to " + existingFile, null);
    }
}
...