66 votes

Liste des fichiers dans un répertoire de Clojure

Comment créer une liste de tous les fichiers d'un répertoire spécifique dans Clojure? Dois-je recourir à Java ou Clojure peut-il gérer cela de manière native?

111voto

ffriend Points 10655

Utilisez la fonction file-seq .

Exemple d'utilisation:

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

34voto

raek Points 1065

Clojure a été conçu pour épouser la plate-forme Java, et c'est un domaine où Clojure ne fournit pas de sa propre API. Cela signifie que vous avez probablement à plonger dans Java, mais les classes que vous avez à travailler avec sont parfaitement utilisables directement à partir de Clojure.

La seule classe que vous devriez lire à propos de la documentation javadoc est - java.io.File, ce qui représente un chemin d'accès au fichier.

http://docs.oracle.com/javase/6/docs/api/java/io/File.html

L' .listFiles exemple de la méthode retourne un tableau (que vous pouvez utiliser en tant que seq) de l' File objets: un pour chaque entrée du répertoire identifié par l' File de l'instance. Il y a d'autres méthodes utiles pour déterminer si une File existe, c'est un répertoire, et ainsi de suite.

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

La Construction Des Objets De Fichiers

Le constructeur de File peut parfois être un peu difficiles à utiliser (surtout lors de la fusion de plusieurs segments de tracé d'un seul coup) et dans ce cas, Clojure fournit une aide utile fonction: clojure.java.io/file. Comme ses arguments, il accepte les segments du chemin comme des chaînes de caractères ou des fichiers. Les segments sont reliés avec le bon séparateur de chemin d'accès de la plate-forme.

http://clojuredocs.org/clojure_core/clojure.java.io/file

Remarque: Clojure fournit également l' file-seq fonction qui retourne une précommande à pied (en tant que seq) si la hiérarchie des fichiers de départ à la donnée de fichier.

14voto

Christian Berg Points 7039

Découvrez également les fs de la bibliothèque.

Il peut ne pas être la peine de tirer dans le supplément de dépendance si vous avez besoin d'une liste de fichiers dans un répertoire, mais il y a beaucoup de fonctions utilitaires-il, par exemple pour:

  • La création d'une structure de répertoire
  • La copie, la suppression, le déplacement
  • La vérification et la modification des autorisations
  • Le fractionnement et la normalisation des chemins
  • Créer des fichiers temporaires et des répertoires
  • D'expansion
  • Travailler avec zip et tar fichiers

13voto

Michiel Borkent Points 11503
 (use 'clojure.java.io)
(-> "/tmp" file .listFiles)
 

Cette dernière expression est un tableau d'objets-fichiers 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"))
 

6voto

larry Points 41

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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X