【问题标题】:Clojure file-system portabilityClojure 文件系统可移植性
【发布时间】:2014-01-18 00:17:32
【问题描述】:

我想写一个简单的程序来播放声音片段。我想在 Windows、Linux 和 MacOSX 上部署它。仍然让我感到困惑的是配置文件和文件夹的位置以及不同操作系统上的声音剪辑。我是 Clojure 菜鸟。我知道 Common Lisp 有一个名为 CL-FAD 的特殊文件系统可移植性库。在 Closure 中是如何完成的?如何在不同系统上编写具有不同文件系统约定的可移植 Clojure 程序?

【问题讨论】:

标签: clojure directory


【解决方案1】:

您可以使用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 是一个流行的文件系统实用程序库。

【讨论】:

  • 要取回一个字符串,你也可以使用(str path)
【解决方案2】:

请注意,Windows 完全支持正斜杠作为路径分隔符(这很棒,因为这样您就不必一直转义反斜杠)。

您将遇到的唯一重大困难是“标准”位置(主文件夹等)在 Windows 和 UNIX 系统上是不同的。所以你需要从系统属性中获取这些(参见http://docs.oracle.com/javase/7/docs/api/java/lang/System.html中的getProperty方法)。

【讨论】:

  • 一种被低估的事实,使人们依赖于其他答案而使用过多行代码:-)
【解决方案3】:

对于独立于平台的方法,您可以从相对于项目的路径中找到规范路径,然后将其与文件名连接起来。

(: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

【讨论】:

    猜你喜欢
    • 2010-10-07
    • 2016-08-09
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2010-11-13
    • 2019-04-27
    • 2011-12-14
    • 2019-12-05
    相关资源
    最近更新 更多