it-swarm-pt.tech

Listando arquivos em um diretório no Clojure

Como posso criar uma lista de todos os arquivos em um diretório específico no Clojure? Preciso recorrer à chamada Java ou o Clojure pode lidar com isso nativamente?

57
Mike Crittenden

Usar file-seq função.

Exemplo de uso:

(def directory (clojure.Java.io/file "/path/to/directory"))
(def files (file-seq directory))
(take 10 files)
96
ffriend

O Clojure foi projetado para adotar a plataforma Java, e essa é uma área em que o Clojure não fornece sua própria API. Isso significa que você provavelmente precisa mergulhar no Java, mas nas classes que precisa trabalhar) com são perfeitamente utilizáveis ​​diretamente da Clojure.

A classe que você deve ler nos javadocs é Java.io.File, que representa um caminho de arquivo .

http://docs.Oracle.com/javase/6/docs/api/Java/io/File.html

O .listFiles _ instance method retorna uma matriz (que você pode usar como seq) de File objects - um para cada entrada no diretório identificado pela instância File. Existem outros métodos úteis para determinar se um File existe, é um diretório e assim por diante.

Exemplo

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

Construindo objetos de arquivo

O construtor de File às vezes pode ser um pouco inconveniente de usar (especialmente ao mesclar vários segmentos de caminho de uma só vez) e, nesse caso, o Clojure fornece uma função útil de ajuda: clojure.Java.io/file. Como argumento, ele aceita segmentos de caminho como strings ou arquivos. Os segmentos são unidos ao separador de caminho correto da plataforma.

http://clojuredocs.org/clojure_core/clojure.Java.io/file

Nota: Clojure também fornece o file-seq função que retorna uma caminhada de pré-encomenda (como uma seq) pela hierarquia de arquivos iniciando no arquivo especificado.

30
raek

Verifique também o biblioteca fs .

Pode não valer a pena extrair a dependência extra se você precisar apenas de uma lista de arquivos em um diretório, mas existem muitas funções utilitárias úteis, por exemplo, para:

  • Criando estruturas de diretório
  • Copiando, excluindo, movendo
  • Verificando e alterando permissões
  • Dividindo e normalizando caminhos
  • Criando arquivos e diretórios temporários
  • Globbing
  • Trabalhando com arquivos zip e tar
14
Christian Berg
(use 'clojure.Java.io)
(-> "/tmp" file .listFiles)

A última expressão é uma matriz de objetos de arquivo retornados do método listFiles, chamado no objeto de arquivo criado a partir do caminho "/ tmp". Esta é uma maneira elegante de escrever:

(.listFiles (file "/tmp"))
9
Michiel Borkent

Normalmente, quando dizemos que queremos listar o diretório, queremos dizer que queremos obter nomes ou caminhos de arquivos, portanto ->

Maneira mais simples de listar o diretório:

(seq (.list (clojure.Java.io/file ".")))

Se você deseja listá-lo recursivo, então:

(map #(.getPath %)
     (file-seq (clojure.Java.io/file ".")))
8
twistsm

Para fazer com que o código modificado corresponda à funcionalidade do código de amostra original, você deve adicionar a chamada para obter os nomes dos arquivos, assim.

(def directory (clojure.Java.io/file "/path/to/directory"))
(def files 
    (for [file (file-seq directory)] (.getName file)))
(take 10 files)
6
larry