web-dev-qa-db-fra.com

Liste des fichiers dans un répertoire de Clojure

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?

57
Mike Crittenden

Utilisation file-seq fonction.

Exemple d'utilisation:

(def directory (clojure.Java.io/file "/path/to/directory"))
(def files (file-seq directory))
(take 10 files)
96
ffriend

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.

Exemple

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

Construction d'objets de fichier

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é.

30
raek

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:

  • Création de structures de répertoires
  • Copier, supprimer, déplacer
  • Vérification et modification des autorisations
  • Fractionnement et normalisation des chemins
  • Création de fichiers et répertoires temporaires
  • Globbing
  • Travailler avec des fichiers Zip et tar
14
Christian Berg
(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"))
9
Michiel Borkent

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 ".")))
8
twistsm

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)
6
larry