2012-04-07 2 views
2

Есть ли библиотеки для выполнения FTP-передачи с clojure, идиоматическими для clojure или необходимо использовать библиотеку java, такую ​​как apache commons?FTP с Clojure

Благодаря

ответ

3

нет необходимости использовать библиотеку Java, и вы можете свернуть полную реализацию FTP в Clojure, но это было бы, как заново изобретать колесо и не является возможным, что нужно сделать. Что вы можете сделать, вероятно, написать более функциональную оболочку над библиотекой Java, а затем использовать эту оболочку в своем коде clojure, чтобы все казалось бесшовным и что многие из существующих библиотек Java используются в Clojure.

1

Вы можете использовать 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:[email protected]: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:[email protected]: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)))))) 
Смежные вопросы