2014-01-18 106 views
7

我想編寫一個簡單的播放聲音片段的程序。我想在Windows,Linux和MacOSX上部署它。仍令我困惑的事情是配置文件和文件夾在不同操作系統上的聲音片段的位置。我是Clojure noob。我知道Common Lisp有特殊的文件系統可移植性庫CL-FAD。如何在閉合中完成?我如何在不同的系統上使用不同的文件系統約定來編寫可移植的Clojure程序?Clojure文件系統的可移植性

+0

看一看http://richhickey.github.io/clojure/clojure.java.io-api.html – Chiron

+0

@Chiron:http://clojure.github.io/clojure/clojure.java .io-api.html是一個更好的網址。 clojure.github.io是當前文檔的放置位置,而Rich Hickey帳戶中的版本來自版本1.1。 – Chuck

回答

21

您可以使用clojure.java.io/file以(主要)平臺無關的方式構建路徑,與Python中的os.path.join或Ruby中的File.join類似。

(require '[clojure.java.io :as io]) 

;; On Linux 
(def home "/home/jbm") 
(io/file home "media" "music") ;=> #<File /home/jbm/media/music> 

;; On Windows 
(def home "c:\\home\\jbm") 
(io/file home "media" "music") ;=> #<File c:\home\jbm\media\music> 

clojure.java.io/file返回java.io.File。如果你需要回到一個字符串,你可以隨時使用.getPath

(-> home 
    (io/file "media" "music") 
    (.getPath)) 
;=> /home/jbm/media/music" 

那是諸如此類的事情,你腦子裏?

除了clojure.java.io(當然還有java.io.File上的方法),raynes.fs是一個流行的文件系統實用程序庫。

+0

要取回一個字符串,你也可以使用'(str path)' –

1

請注意,Windows完全支持正斜槓作爲路徑分隔符(這非常棒,因爲這種方式您不必始終避免反斜槓)。

您遇到的唯一重大困難是Windows和UNIX系統上的「標準」位置(主文件夾等)不同。因此,您需要從系統屬性中獲取這些信息(請參見http://docs.oracle.com/javase/7/docs/api/java/lang/System.html中的getProperty方法)。

0

對於獨立於平臺的方法,您可以從相對於項目的路徑找到規範路徑,然後將其與文件名相加。

(:require [clojure.java.io :as io :refer [file]])) 

(defn file-dir 
    "Returns canonical path of a given path" 
    [path] 
    (.getCanonicalPath (io/file path))) 

(-> "./resources" ;; relative 
    (file-dir) 
    (io/file "filename.txt")) ;;=> /path/to/project/resources/filename.txt