5 Stimmen

Clojure zum Erstellen von Symlinks verwenden

Ich habe mich in letzter Zeit auf Clojure als mögliche funktionale Sprache für die Erstellung von System-Skripten konzentriert. Bis mir klar wurde, dass die JVM darunter bedeutet, dass ich auf die Fähigkeiten von Java beschränkt bin.

Wie erstelle ich also einen Symlink? Oder einen Hardlink? Ich meine ohne (sh "ln" ...) .

2voto

Michał Marczyk Punkte 82196

Ah, das ist in der Tat ein Problem. Ich bin mir nicht sicher, ob die sh Option ist eigentlich gar nicht so schlecht... Abgesehen davon bietet Ant eine Symlink-Aufgabe, die Sie auf einigermaßen Clojure-freundliche Weise über Lancet verwenden können, den Ant-Wrapper, der ursprünglich von Stuart Halloway in seinem Buch "Programming Clojure" vorgestellt wurde und derzeit intern von Leiningen verwendet wird. Wenn Sie den Symlink-Task in Leiningen in Aktion sehen wollen, werfen Sie einen Blick auf diese Zeile in der Version 1.3.0.

2voto

Jürgen Hötzel Punkte 17196

Sie könnten verwenden Nativer Java-Zugang um auf native Bibliotheken auf dem Zielhost zuzugreifen.

Einfaches Beispiel:

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

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

Es sind auch Clojure-Wrapper verfügbar: clj-native y clojure-jna

0voto

Arthur Ulfeldt Punkte 89086

Das ist nur eine Randnotiz:

bei der Verwendung von Clojure für Systembefehle, wenn Sie Kuchen statt leiningen kann es eine persistente JVM verwenden, so dass Sie nicht jedes Mal drei Sekunden warten müssen, bis die JVM startet, wenn Sie einen Befehl ausführen.

*cake ist nicht sehr stabil, so dass es an manchen Tagen viel besser funktioniert als an anderen. (Stand: Sep. 2010)

0voto

Kevin Zhu Punkte 2549

Sie können die Vorteile dieser Bibliothek nutzen https://github.com/ToBeReplaced/nio.file was für mich funktioniert

(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")

Eine entsprechende Berechtigung ist erforderlich. Um es z.B. unter Windows 7 in einer Emacs/Cider-Umgebung auszuführen, muss der Emacs von einem Admin-Befehlsfenster aus gestartet werden, sonst beschwert er sich "FileSystemException java.nio.file.FileSystemException: c: \tmp\myFolder\test.txt : Ein erforderliches Privileg wird vom Kunden nicht wahrgenommen"

0voto

nackjicholson Punkte 4149
(require '[clojure.java.io :as io])
(import '[java.nio.file Files Paths]
        '[java.nio.file.attribute FileAttribute])

(def user-home (System/getProperty "user.home"))
(def user-pwd (System/getProperty "user.dir"))

(defn path [p]
  (let [expanded (.replaceFirst p "^~" user-home)]
    (Paths/get expanded (make-array String 0))))

(defn symlink
  [link target & attrs]
  (let [link-path (path link)
        target-path (path (.getPath (io/file user-pwd target)))]
    (Files/createSymbolicLink link-path target-path (into-array FileAttribute attrs))))

Das habe ich mir ausgedacht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X