是否有任何库可以使用 clojure 执行 FTP 传输,惯用 clojure,或者是否有必要使用 java 库,如 apache commons?
谢谢
没有必要使用 java 库,您可以在 Clojure 中滚动完整的 FTP 实现,但这就像重新发明轮子一样,不是一件可行的事情。您可以做的可能是在 Java 库上编写一个功能更强大的包装器,然后在您的 clojure 代码中使用该包装器,这样一切看起来都是无缝的,而不是在 Clojure 中使用了多少现有的 Java 库。
您可以通过调用一些便利功能或打开客户端并使用它调用多个命令来使用https://github.com/miner/clj-ftp 。
完整的 API 记录在 GitHub 的https://github.com/miner/clj-ftp/blob/master/src/miner/ftp.clj中。
project.clj 的内容
(defproject my-sweet-project "0.5.0"
:dependencies [[com.velisco/clj-ftp "0.3.0"]
; Other deps
]
; ...
)
调用单个 FTP 命令
这将为每个命令打开新的 FTP 连接,因此它只能用于调用单个命令。有关这些便利功能的完整列表,请参阅完整的 API。
(ns my-sweet-name.space
(:require [miner.ftp :as ftp]))
(defn list-files-from-ftp-server []
"Here we list contents of a directory with a convenience function"
(let [ftp-url "ftp://username:password@my.ftp.server.host:port/path/to/stuff"]
(ftp/list-files ftp-url)))
调用具有相同连接的多个命令
这将打开 FTP 连接并使用它调用任意数量的命令。这应该在应该调用多个命令时使用。FTP 连接将自动关闭。再次检查完整的 API 以获取完整的函数列表。
(ns my-sweet-name.space
(:require [miner.ftp :as ftp]))
(defn list-and-download-files []
"Here we list and download contents of a directory"
(let [ftp-url "ftp://username:password@my.ftp.server.host:port/path/to/stuff"]
(ftp/with-ftp [ftp-client ftp-url]
; client-file-names is used to list contents of the ftp-url
; client-get is used to download a file
(doseq [file-name (ftp/client-file-names ftp-client)]
(let [local-file-name (str "/download-path/" file-name)]
(ftp/client-get ftp-client file-name local-file-name))))))
https://github.com/miner/clj-ftp是 Apache Commons Net 的包装器。