在Clojure的目录中列出文件
我如何从Clojure的特定目录中的所有文件中创build一个列表? 我必须诉诸于调用Java或Clojure可以处理这个本地?
使用file-seq
function。
用法示例:
(def directory (clojure.java.io/file "/path/to/directory")) (def files (file-seq directory)) (take 10 files)
Clojure被devise为支持Java平台,这是Clojure没有提供自己的API的一个领域。 这意味着您可能需要深入Java,但是您必须使用的类可以直接从Clojure中直接使用。
你应该在javadocs中读到的一个类是java.io.File
,它代表一个文件path 。
http://docs.oracle.com/javase/6/docs/api/java/io/File.html
.listFiles
实例方法返回File
对象的数组(您可以将其用作seq) – 对于File
实例标识的目录中的每个条目,都会有一个。 还有其他有用的方法来确定一个File
是否存在,是一个目录,等等。
例
(ns my-file-utils (:import java.io.File)) (defn my-ls [d] (println "Files in " (.getName d)) (doseq [f (.listFiles d)] (if (.isDirectory f) (print "d ") (print "- ")) (println (.getName f)))) ;; Usage: (my-ls (File. "."))
构造文件对象
File
的构造函数有时会有点不方便(尤其是在合并多个path段时),在这种情况下,Clojure提供了一个有用的帮助函数: clojure.java.io/file
。 作为它的参数,它接受path段作为string或文件。 这些段与平台的正确path分隔符连接。
http://clojuredocs.org/clojure_core/clojure.java.io/file
注意:Clojure还提供了file-seq
函数,该函数通过从给定文件开始的文件层次结构返回一个前序遍历(作为seq)。
另外检查出的FS库 。
如果您只需要目录中的文件列表,则可能不值得引入额外的依赖关系,但是有很多有用的实用程序function,例如:
- 创build目录结构
- 复制,删除,移动
- 检查和更改权限
- 分割和规范化path
- 创build临时文件和目录
- 通配符
- 使用zip和tar文件
(use 'clojure.java.io) (-> "/tmp" file .listFiles)
后者expression式是从方法listFiles返回的文件对象的数组,在从path“/ tmp”创build的文件对象上调用。 这是一个奇特的写法:
(.listFiles (file "/tmp"))
要使修改后的代码与原始示例代码的function相匹配,您应该添加调用以获取文件名,如下所示。
(def directory (clojure.java.io/file "/path/to/directory")) (def files (for [file (file-seq directory)] (.getName file))) (take 10 files)
通常,当我们说要列出目录时,我们的意思是我们要获取文件名或path,所以 – >
列出目录最简单的方法是:
(seq (.list (clojure.java.io/file ".")))
如果你想recursion列出,那么:
(map #(.getPath %) (file-seq (clojure.java.io/file ".")))