Scripting 使用Clojure创建符号链接

Scripting 使用Clojure创建符号链接,scripting,clojure,symlink,Scripting,Clojure,Symlink,我最近一直在关注Clojure,它是一种可能用于编写系统脚本的函数式语言。直到,我才意识到,拥有JVM意味着我仅限于Java的能力 那么,如何创建符号链接?还是硬链接?我的意思是没有(sh“ln”…)啊,这确实是一种痛苦。实际上,我不确定sh选项是否那么糟糕。。。话虽如此,Ant提供了一个符号链接任务,您可以通过Lancet以合理的Clojure友好方式使用它,Lancet是Ant包装器,最初由Stuart Halloway在其“Programming Clojure”一书中介绍,目前由Lein

我最近一直在关注Clojure,它是一种可能用于编写系统脚本的函数式语言。直到,我才意识到,拥有JVM意味着我仅限于Java的能力


那么,如何创建符号链接?还是硬链接?我的意思是没有
(sh“ln”…)
啊,这确实是一种痛苦。实际上,我不确定
sh
选项是否那么糟糕。。。话虽如此,Ant提供了一个符号链接任务,您可以通过Lancet以合理的Clojure友好方式使用它,Lancet是Ant包装器,最初由Stuart Halloway在其“Programming Clojure”一书中介绍,目前由Leiningen在内部使用。如果您想在Leiningen中查看符号链接任务,请查看1.3.0版本。

您可以使用它访问目标主机上的本机LIB

简单的例子:

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

 (defn symlink [oldpath newpath]
    (-> (Function/getFunction "c" "symlink")
    (.invoke Integer (to-array [oldpath newpath]))))
还有Clojure包装纸可供使用: 和

这是一个旁注:

在使用Clojure执行系统命令时,如果您使用而不是leiningen,那么它可以使用持久JVM,这样您就不必在每次运行命令时等待三秒钟JVM启动


*蛋糕不是很稳定,所以有时它比其他的好得多。(截至2010年9月)

你可以利用这个为我服务的图书馆

(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")
注意:需要相关的特权。例如,要在Emacs/Cider环境中的Windows 7中运行它,Emacs需要从管理命令窗口启动,否则它会抱怨“FileSystemException java.nio.file.FileSystemException:c:\tmp\myFolder\test.txt:客户端未持有所需的权限”


这就是我想到的。

也看看是怎么回事。我想每种语言都有它的缺点。哦,麻烦了,现在我不确定lein中的符号链接是否有效。。。我想人们应该把这看作是一个考验自己内心平静的机会!我看到,在Path类中,我们可能会得到一个
ishiden
方法。这是否意味着能够创建隐藏文件…?最后未来是光明的。(很抱歉偏离主题…)我认为
sh
选项可能是你最好的选择;符号链接不是真正的x平台,因此在Java中缺乏支持。这是一篇关于如何通过JNI将符号链接与Java中的常规文件区分开来的好文章。顺便说一句,我从来没有想过“符号链接不可移植”。至少一个
.isSymbolicLink
方法是完全跨平台的(如果承载文件的平台首先不支持符号链接,则返回
false
,如果由于某种原因无法找到正确答案,则可能引发异常),对吗?(Java可能令人恼火。)
(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))))