Используйте Clojure для создания символической ссылки - PullRequest
5 голосов
/ 20 августа 2010

Недавно я сосредоточился на Clojure как возможном функциональном языке для написания системных сценариев.До меня до меня дошло, что наличие JVM означает, что я ограничен возможностями Java.

Итак, как мне создать символическую ссылку?Или жесткая ссылка?Я имею в виду без (sh "ln" ...).

Ответы [ 5 ]

3 голосов
/ 07 июня 2012

В интересах любого, кто найдет этот вопрос сейчас, в Java SE 7 вы можете использовать пакет java.nio.file.Files для создания ссылок. Я думаю, что это то, на что ссылался Михал Марчик в своем комментарии о будущем.

createLink

public static Path createLink(Path link,
                              Path existing)
                   throws IOException

createSymbolicLink

public static Path createSymbolicLink(Path link,
                                      Path target,
                                      FileAttribute<?>... attrs)
                   throws IOException

Эта страница из руководства по java docs содержит следующие примеры.

Создание символической ссылки

Path newLink = ...;
Path target = ...;
try {
    Files.createSymbolicLink(newLink, target);
} catch (IOException x) {
    System.err.println(x);
} catch (UnsupportedOperationException x) {
    // Some file systems do not support symbolic links.
    System.err.println(x);
}

Создание жесткой ссылки

Path newLink = ...;
Path existingFile = ...;
try {
    Files.createLink(newLink, existingFile);
} catch (IOException x) {
    System.err.println(x);
} catch (UnsupportedOperationException x) {
    // Some file systems do not
    // support adding an existing
    // file to a directory.
    System.err.println(x);
}
2 голосов
/ 20 августа 2010

Вы можете использовать Собственный доступ Java для доступа к собственным библиотекам на целевом хосте.

Простой пример:

(ns jna-test
    (:import 
     (com.sun.jna Native Function)))

 (defn symlink [oldpath newpath]
    (-> (Function/getFunction "c" "symlink")
    (.invoke Integer (to-array [oldpath newpath]))))

Также доступны упаковщики Clojure: clj-native и Clojure-джна

2 голосов
/ 20 августа 2010

Ах, это действительно боль.Я не уверен, что опция sh настолько плоха, что на самом деле ... Сказав это, Ant предоставляет задачу символической ссылки, которую вы можете использовать с помощью Lancet, дружественной к Clojure, обертки Ant, первоначально представленной Stuart Halloway.в своей книге «Programming Clojure» и в настоящее время используется внутри Leiningen.Если вы хотите увидеть задачу символической ссылки в действии в Лейнингене, посмотрите на эту строку в версии 1.3.0.

0 голосов
/ 28 апреля 2015

Вы можете воспользоваться этой библиотекой https://github.com/ToBeReplaced/nio.file, которая работает для меня

(require '[org.tobereplaced.nio.file :refer [create-symbolic-link! ] :as nio])

(defn createSimLink [ targetPath newLink ]
  (let [theName (.getName (File. targetPath))]
    (try
      (nio/create-symbolic-link!  (str  newLink "/" theName)  targetPath  )
      (catch Exception e (prn "error " e)))))

(createSimLink "c:/tmp/test.txt" "c:/tmp/myFolder")

Примечание. Необходима связанная с этим привилегия.Например, чтобы запустить его в Windows 7 в среде Emacs / Cider, emacs должен быть запущен из окна командной строки администратора, в противном случае он выдаст сообщение «FileSystemException java.nio.file.FileSystemException: c: \ tmp \ myFolder \ test.txt:Требуемая привилегия не удерживается клиентом "

0 голосов
/ 10 сентября 2010

Это что-то вроде примечания:

при использовании Clojure для системных команд, если вы используете cake вместо leiningen, он может использовать постоянную JVM, поэтому вам не нужно ждать три секунды для запуска JVM при каждом запуске команды.

* торт не очень стабилен, поэтому в некоторые дни он работает намного лучше, чем другие. (по состоянию на сентябрь 2010 г.)

...