在ruby中,我经常使用File.expand_path(File.dirname(__FILE__))
来加载包含测试数据的配置文件或文件。现在我正在尝试在我的clojure应用程序中加载一些html文件进行测试,如果没有硬编码文件的完整路径,我无法弄清楚如何做到这一点。
编辑: 我正在使用leinigen,如果这有任何帮助
ref:__ FILE__是一个特殊文字,它返回执行时给程序的文件名(包括任何路径)。见(rubydoc& perldata)
答案 0 :(得分:13)
*file*
API Reference(将*file*
添加到网址)
答案 1 :(得分:9)
这是在Clojure中复制它的一种方法:
(defn dirname [path]
(.getParent (java.io.File. path)))
(defn expand-path [path]
(.getCanonicalPath (java.io.File. path)))
然后你在Clojure中的Ruby行File.expand_path(File.dirname(__FILE__))
就是这样:
(expand-path (dirname *file*))
请参阅Java interop docs了解.getParent
& .getCanonicalPath
。
NB。我认为*file*
总是返回Clojure中的绝对(虽然不是规范)路径名/文件名。而__FILE__返回执行时提供的路径名/文件名。但是我不认为这些差异会影响你的尝试吗?
/ I3az /
答案 2 :(得分:7)
9点解决方案都不正确。 * file *为您提供相对于类路径的文件。在* file *上使用.getCanonicalPath或.getAbsolutePath将为您提供一个不存在的文件。正如this old thread中所指出的,您需要使用ClassLoader来正确解析* file *。这是我用来获取当前文件的父目录的内容:
(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent)
答案 3 :(得分:0)
根据user83510上面的回答,完整的答案是:
(def path-to-this-file
(clojure.string/join "/" [(-> (ClassLoader/getSystemResource *file*) clojure.java.io/file .getParent) (last (clojure.string/split *file* #"/"))]))
它不漂亮但它有效:P