Clojure:使用特定的ext过滤文件,但不使用文件夹文件夹

时间:2018-10-14 06:06:08

标签: clojure

我是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 :(得分:2)

您可以将过滤文件所依据的标准移动到单独的功能中。这将更好地传达您将如何处理清单。然后,您可以使用filter来应用这些条件。

此外,从相关名称空间使用Clojure库函数而不是使用Java方法来处理字符串和文件(例如,clojure.string/includes?而不是String.contains方法)也被认为是更好的做法。 / p>

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