Как реализовать "mklink /H" (hardlinking) в Java?
Я хочу создать жесткую ссылку из файла "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 ответа
Есть 3 способа создать жесткую ссылку в JAVA.
JAVA 1.7 Поддерживает жесткие ссылки.
http://docs.oracle.com/javase/tutorial/essential/io/links.html
JNA, JNA позволяет вам делать системные вызовы.
JNI, вы можете использовать C++ для создания жесткой ссылки, а затем вызывать ее через JAVA.
Надеюсь это поможет.
Ссылка (мягкая или жесткая) - это функция ОС, которая не предоставляется стандартным API Java. Я бы предложил вам запустить команду mklink /h
из Java с помощью Runitme.exec()
или же ProcessBuilder
,
Или же попробуйте найти сторонний API, который оборачивает это. Также проверьте, что нового в Java 7. К сожалению, я не знаком с этим, но я знаю, что они добавили богатый API файловой системы.
Для потомков я использую следующий метод для создания ссылок на *nix/OSX или 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);
}
}