最近,我一直在关注Clojure作为一种可能用于系统脚本编写的函数式语言。但是,我意识到使用JVM作为底层意味着我受限于Java的能力。
那么,如何创建符号链接?或硬链接?我的意思是不使用(sh "ln" ...)
命令。
(ns jna-test
(:import
(com.sun.jna Native Function)))
(defn symlink [oldpath newpath]
(-> (Function/getFunction "c" "symlink")
(.invoke Integer (to-array [oldpath newpath]))))
啊,这确实很烦人。我不确定sh
选项到底有多糟糕... 话虽如此,Ant提供了一个符号链接任务,你可以通过Lancet以合理的Clojure友好方式使用它,Lancet是Stuart Halloway在他的《Programming Clojure》书中最初介绍的Ant包装器,目前由Leiningen内部使用。如果你想在Leiningen中看到符号链接任务的效果,请查看1.3.0版本中的这一行。
(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: A required privilege is not held by the client”的错误提示。
这是一个旁注:
当使用Clojure进行系统命令时,如果您使用cake而不是leiningen,它可以使用持久的JVM,因此每次运行命令时无需等待三秒钟启动JVM。
*cake不太稳定,因此有些日子它比其他日子表现更好。(截至2010年9月)
(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))))
这就是我想出来的。
isHidden
方法。这是否意味着能够创建隐藏文件...?终于有了吗?未来是光明的。(抱歉偏离主题...)我认为sh
选项可能是您最好的选择;符号链接不是真正的跨平台,因此在Java中缺乏支持。 - Isaac.isSymbolicLink
方法将是完全跨平台的(如果托管文件的平台首先不支持符号链接,则返回false
,如果由于某种原因它无法发现正确答案,则可能会抛出异常),对吧?(Java有时令人沮丧。) - Michał Marczyk