SBCL에서 디렉토리 내의 파일/디렉토리 리스트를 가져오는 방법입니다. (sb-posix, sb-grovel을 사용한 방법)
1. 디렉토리 리스트 가져오기
(require :sb-posix)
(require :sb-grovel)
(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
(ignore-errors
(sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
)
)
(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
(let ((dir (sb-posix:opendir pathname)))
(prog1
(loop for dirent = (sb-posix:readdir dir)
until (sb-grovel::foreign-nullp dirent)
unless (or (equal (sb-posix:dirent-name dirent) ".")
(equal (sb-posix:dirent-name dirent) ".."))
collect (concatenate 'string pathname "/"
(sb-posix:dirent-name dirent)))
(sb-posix:closedir dir))
)
)
(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
(remove-if-not #'is-directory (get-directory-contents dir))
)
(defparameter dir-list nil)
(setq dir-list (get-dirs ".")) ; 현재 디렉토리 내의 디렉토리를 가져와 DIR-LIST에 저장한다
(dolist (dir dir-list) ; DIR-LIST의 내용을 출력한다
(print dir)
)
2. 파일 리스트 가져오기
(require :sb-posix)
(require :sb-grovel)
(defun is-directory (pathname) ; 주어진 경로가 디렉토리인지 체크한다
(ignore-errors
(sb-posix:s-isdir (sb-posix:stat-mode (sb-posix:lstat pathname)))
)
)
(defun get-directory-contents (pathname) ; 주어진 경로 내의 모든 디렉토리/파일 리스트를 얻는다
(let ((dir (sb-posix:opendir pathname)))
(prog1
(loop for dirent = (sb-posix:readdir dir)
until (sb-grovel::foreign-nullp dirent)
unless (or (equal (sb-posix:dirent-name dirent) ".")
(equal (sb-posix:dirent-name dirent) ".."))
collect (concatenate 'string pathname "/"
(sb-posix:dirent-name dirent)))
(sb-posix:closedir dir))
)
)
(defun get-dirs (dir) ; 주어진 경로 내의 모든 디렉토리 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리가 아닌 항목을 제거한다)
(remove-if-not #'is-directory (get-directory-contents dir))
)
(defun get-files (dir) ; 주어진 경로 내의 모든 파일 리스트를 얻는다 (get-directory-contents의 결과 중 디렉토리인 항목을 제거한다)
(remove-if #'is-directory (get-directory-contents dir))
)
(defparameter file-list nil)
(setq file-list (get-files ".")) ; 현재 디렉토리 내의 파일 리스트를 가져와 FILE-LIST에 저장한다
(dolist (file-item file-list) ; FILE-LIST의 내용을 출력한다
(print file-item)
)
<테스트 환경>
OS : Windows 7
Emacs 버전 : Emacs 24.3 윈도우용SBCL 버전 : 1.2.7
Slime 버전 : 2.21'1. 연구 모듈 > Lisp - Common Lisp' 카테고리의 다른 글
[Lisp] Common Lisp 여러가지 팁 (0) | 2015.07.11 |
---|---|
[Lisp] Common Lisp 문자열(String) 관련 함수 정리 (0) | 2015.07.11 |
[Lisp/SBCL] SBCL 스크립트로 실행시, 파라미터 처리 (0) | 2015.06.28 |
[Lisp/SBCL] SBCL 스크립트로 실행하기 (0) | 2015.06.28 |
[겉핥기 프로젝트] Emacs에 SBCL 세팅하기 (0) | 2015.01.09 |