Список файлов в каталоге в Clojure



Как я могу создать список из всех файлов в определенном каталоге в Clojure? Должен ли я прибегать к вызову Java или Clojure может справиться с этим изначально?

561   6  

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

    Ничего не найдено.