在Clojure的目录中列出文件

我如何从Clojure的特定目录中的所有文件中创build一个列表? 我必须诉诸于调用Java或Clojure可以处理这个本地?

使用file-seqfunction。

用法示例:

 (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 ".")))