Listing files in a directory in Clojure
Use file-seq
function.
Usage example:
(def directory (clojure.java.io/file "/path/to/directory"))
(def files (file-seq directory))
(take 10 files)
Clojure was designed to embrace the Java platform, and this is one area where Clojure does not provide its own API. This means that you probably have to dive into Java, but the classes you have to work with are perfectly usable directly from Clojure.
The one class you should read about in the javadocs is java.io.File
, which represents a file path.
http://docs.oracle.com/javase/6/docs/api/java/io/File.html
The .listFiles
instance method returns an array (which you can use as a seq) of File
objects – one for each entry in the directory identified by the File
instance. There are other useful methods for determining whether a File
exists, is a directory, and so on.
Example
(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. "."))
Constructing File Objects
The constructor of File
can sometimes be a bit inconvenient to use (especially when merging many path segments in one go) and in this case Clojure provides a useful helper function: clojure.java.io/file
. As its arguments it accepts path segments as strings or files. The segments are joined with the correct path separator of the platform.
http://clojuredocs.org/clojure_core/clojure.java.io/file
Note: Clojure also provides the file-seq
function which returns a preorder walk (as a seq) though the file hierarchy starting at the given file.
Also check out the fs library.
It may not be worth pulling in the extra dependency if you just need a list of files in a directory, but there are many useful utility functions there, for example for:
- Creating directory structures
- Copying, deleting, moving
- Checking and changing permissions
- Splitting and normalizing paths
- Creating temporary files and directories
- Globbing
- Working with zip and tar files