Comment puis-je créer une liste de tous les fichiers dans un répertoire spécifique dans Clojure? Dois-je recourir à l'appel Java ou Clojure peut-il gérer cela de manière native?
Utilisation file-seq
fonction.
Exemple d'utilisation:
(def directory (clojure.Java.io/file "/path/to/directory"))
(def files (file-seq directory))
(take 10 files)
Clojure a été conçu pour embrasser la plate-forme Java, et c'est un domaine où Clojure ne fournit pas sa propre API. Cela signifie que vous devez probablement plonger dans Java, mais les classes que vous devez travailler avec sont parfaitement utilisables directement depuis Clojure.
La seule classe à lire dans les javadocs est Java.io.File
, qui représente un chemin de fichier .
http://docs.Oracle.com/javase/6/docs/api/Java/io/File.html
Le .listFiles
la méthode d'instance renvoie un tableau (que vous pouvez utiliser comme séquence) d'objets File
- un pour chaque entrée du répertoire identifié par l'instance File
. Il existe d'autres méthodes utiles pour déterminer si un File
existe, s'il s'agit d'un répertoire, etc.
(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. "."))
Le constructeur de File
peut parfois être un peu gênant à utiliser (surtout lors de la fusion de plusieurs segments de chemin en une seule fois) et dans ce cas, Clojure fournit une fonction d'aide utile: clojure.Java.io/file
. Comme arguments, il accepte les segments de chemin sous forme de chaînes ou de fichiers. Les segments sont joints avec le séparateur de chemin correct de la plate-forme.
http://clojuredocs.org/clojure_core/clojure.Java.io/file
Remarque: Clojure fournit également le file-seq
fonction qui renvoie une marche de précommande (sous forme de séquence) à travers la hiérarchie des fichiers à partir du fichier donné.
Consultez également la bibliothèque fs .
Il ne vaut peut-être pas la peine de tirer parti de la dépendance supplémentaire si vous avez juste besoin d'une liste de fichiers dans un répertoire, mais il existe de nombreuses fonctions utilitaires utiles, par exemple pour:
(use 'clojure.Java.io)
(-> "/tmp" file .listFiles)
Cette dernière expression est un tableau d'objets File renvoyés par la méthode listFiles, appelée sur l'objet fichier créé à partir du chemin "/ tmp". C'est une façon élégante d'écrire:
(.listFiles (file "/tmp"))
Habituellement, lorsque nous disons que nous voulons répertorier le répertoire, nous voulons dire que nous voulons obtenir les noms de fichiers ou les chemins, donc ->
Manière la plus simple de lister le répertoire:
(seq (.list (clojure.Java.io/file ".")))
Si vous voulez le lister récursif, alors:
(map #(.getPath %)
(file-seq (clojure.Java.io/file ".")))
Pour que le code modifié corresponde aux fonctionnalités de l'exemple de code d'origine, vous devez ajouter l'appel pour obtenir les noms de fichier, comme ceci.
(def directory (clojure.Java.io/file "/path/to/directory"))
(def files
(for [file (file-seq directory)] (.getName file)))
(take 10 files)