(ns bpsmannschott (:import java.io.File) (:import java.io.FileNotFoundException)) (defn as-file [s] "Return whatever we have as a java.io.File object" (cond (instance? File s) s ; already a file, return unchanged (string? s) (File. s) ; return java.io.File for path s :else (throw (FileNotFoundException. (str s))))) (defn walk [^File dir] (let [children (.listFiles dir) subdirs (filter #(.isDirectory %) children) files (filter #(.isFile %) children)] (concat files (mapcat walk subdirs)))) ;; EXAMPLE ;; count the number of files in or below /tmp ;; ;; (count (walk (as-file "/tmp"))) ;; ;; alternately: ;; ;; (-> "/tmp" as-file walk count)