in Clojure

Clojure – 특정 폴더에서 파일들을 읽어오고 싶을때

상황

특정 폴더에서 파일 들을 읽어오고 싶을 때가 있다 이럴 때는 어떻게 해야할까?

문제 해결

Tip 아래의 방법을 이용하여 샘플 폴더와 샘플 파일들을 만들어보자. (리눅스 또는 맥 환경에서)

$ mkdir -p next-gem
$ touch next-gen/picard.jpg next-gen/locutus.bmp next-gen/data.txt

java.io.File 객체들을 lazy sequence로 받기 위해 file-seq 함수를 사용 할 수 있다.

(def tag-dir (file-seq (clojure.java.io/file "./next-gen")))

tng-dir
;; -> (#<File ./next-gen>
;;     #<File ./next-gen/picard.jpg>
;;     #<File ./next-gen/locutus.bmp>
;;     #<File ./next-gen/data.txt>)

시퀀스는 클로저에서 좀더 파워풀하게 표현하는 추상적인 개념이다. map또는 filter함수를 사용하여 디렉토리 계층에 있는 것들을 재사용할 수 있다.

주의사항으로 만약 디렉토리가 아닐 파일만 필요할 경우 파일 객체의 .isFile 속성을 사용하길 권장한다.

(defn only-files
[files]
(filter #(.isFile %) files))
(only-files tng-dir)
;; -> (#<File ./next-gen/data.txt>
;;     #<File ./next-gen/locutus.bmp>
;;     #<File ./next-gen/picard.jpg>)

만약 파일명만 보여주고 싶다면 파일객체의 .getName을 이용하자.

(defn names
[files]
(map #(.getName %) files))

(-> tng-dir only-files names)
;; -> ("data.txt" "locutus.bmp" "picard.jpg")

이상!

Write a Comment

Comment