Clojure: фильтр файлов с определенной папкой ext, но не папками - PullRequest
0 голосов
/ 14 октября 2018

Я новичок в Clojure.
У меня есть приложение Clojure, которое предоставляет каталог журналов для http / s.Но, к сожалению, в этом же каталоге есть и другие файлы.Мне нужно фильтровать файлы только с расширением .log *.

У нас был следующий код:

(defn get-dir-listing [dir]
  (map #(get-all-attribs %) (fs/list-dir dir)))

(defn get-all-attribs [fpath]
{:type    (if (fs/directory? fpath)
            "Directory"
            "File")
 :name    (.getName fpath)
 :modtime (-> (fs/mod-time fpath)
              time/from-long)
 :size    (-> (fs/size fpath)
              get-size-in-KB)
})

Я изменил его на следующее:

(defn get-dir-listing [dir]
  (map #(get-dirs-log-files-only %) (fs/list-dir dir)))

(defn get-dirs-log-files-only [fpath]
 (if (and (not (fs/directory? fpath)) (.contains (.getName fpath) ".log"))
    (get-all-attribs fpath)

  (if (fs/directory? fpath)
     (get-all-attribs fpath))))

(defn get-all-attribs [fpath]
{:type    (if (fs/directory? fpath)
            "Directory"
            "File")
 :name    (.getName fpath)
 :modtime (-> (fs/mod-time fpath)
              time/from-long)
 :size    (-> (fs/size fpath)
              get-size-in-KB)
})

;To remove nil
(remove nil? (get-dir-listing "C:\\tmp"))

У кого-нибудь есть лучший способ решить его?

1 Ответ

0 голосов
/ 14 октября 2018

Вы можете переместить критерии, по которым вы фильтруете файлы, в отдельную функцию.Это будет лучше передавать то, что вы собираетесь делать с листингом.Затем вы можете использовать filter для применения этих критериев.

Также рекомендуется использовать библиотечные функции Clojure из соответствующих пространств имен вместо использования метода Java для работы со строками и файлами (например, clojure.string/includes? вместо String.contains метода).

(ns ...
  :require [... [clojure.string :as cs]])

(defn is-log-or-dir? [fpath]
  (or (fs/directory? fpath)
      (cs/includes? (fs/base-name fpath) ".log")))

(defn get-dir-listing [dir]
  (map get-all-attribs (filter is-log-or-dir? dir)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...