6 ответов:
использовать
file-seq
Clojure был разработан, чтобы охватить платформу Java, и это одна из областей, где Clojure не предоставляет свой собственный API. Это означает, что вам, вероятно, придется погрузиться в Java, но классы, с которыми вы должны работать, отлично подходят непосредственно из Clojure.
один класс, о котором вы должны прочитать в javadocs-это
java.io.File, что составляет путь.http://docs.oracle.com/javase/6/docs/api/java/io/File.html
The
.listFilesметод экземпляра возвращает массив (который можно использовать как seq)Fileобъекты – по одному для каждой записи в каталоге, выявленныхFileэкземпляра. Есть и другие полезные методы для определения того, является лиFileсуществует, является каталогом и так далее.пример
(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. "."))Строительство Файл Объекты
конструктор
Fileиногда может быть немного неудобно использовать (особенно при объединении многих сегментов пути за один раз), и в этом случае Clojure предоставляет полезную вспомогательную функцию:clojure.java.io/file. В качестве аргументов он принимает сегменты пути в виде строк или файлов. Сегменты соединяются с правильным разделителем пути платформы.http://clojuredocs.org/clojure_core/clojure.java.io/file
Примечание: Clojure также обеспечивает элемент
file-seqфункция, которая возвращает предзаказ ходьбы (как seq), хотя иерархия файлов, начиная с данного файла.
также проверить библиотека ФС.
возможно, не стоит вытаскивать дополнительную зависимость, Если вам просто нужен список файлов в Каталоге, но там есть много полезных функций утилиты, например:
- создание структуры каталогов
- копирование, удаление, перемещение
- проверка и изменение разрешения
- расщепление и нормализация путей
- создание временных файлов и каталоги
- подстановка
- работа с zip и tar файлами
(use 'clojure.java.io) (-> "/tmp" file .listFiles)последнее выражение представляет собой массив объектов File, возвращаемых из метода listFiles, вызываемый на объект file, созданный из пути "/tmp". Это причудливый способ написать:
(.listFiles (file "/tmp"))
чтобы измененный код соответствовал функциональности исходного образца кода, Вы должны добавить вызов для получения имен файлов, например.
(def directory (clojure.java.io/file "/path/to/directory")) (def files (for [file (file-seq directory)] (.getName file))) (take 10 files)
самый простой способ перечислить каталог:
(seq (.list (clojure.java.io/file ".")))Если вы хотите перечислить его рекурсивно, то:
(map #(.getPath %) (file-seq (clojure.java.io/file ".")))
Comments