逆引きxyzzy lisp(ディレクトリ) - circleratio/xyzzy GitHub Wiki

目次

ディレクトリの作成

(create-directory "c:/temp/test")
=> t

ディレクトリは再帰的に作ることができる. すなわち,"c:/temp" が空ディレクトリの状態から

(create-directory "c:/temp/test/test2/test3")

を実行しても問題なくディレクトリを作成できる.

中身が空でないディレクトリを削除する

(delete-directory "c:/temp/test")
=> t

ディレクトリ名を変更する

ファイル名を変更する|逆引きxyzzy lisp(ファイルアクセス)に同じ.

ディレクトリの詳細情報を得る

ファイルの詳細情報を取得する|逆引きxyzzy lisp(ファイルアクセス)に同じ.

ディレクトリのファイルモードを変更する

できない.

ディレクトリの所有者とグループを変更する

できない.

ディレクトリの最終アクセス時刻と最終更新日時を変更する

(set-file-write-time "c:/temp/test2" (get-universal-time))
=> t

カレントディレクトリの取得と変更

xyzzyはバッファごとに作業ディレクトリを持つ.

(default-directory)
=> "C:/usr/xyzzy/"

(cd "..")
=> t
(default-directory)
=> "C:/usr/"

ディレクトリ内のファイル名を得る

directory関数を使う.

(directory "c:/temp")
=> ("test.txt" "testib2c.log")

(directory "c:/temp" :file-info t)
=> (("test.txt" 32 3506167444 9 nil) ("testib2c.log" 32 3506168144 0 nil))

(directory "c:/temp/*.log" :wile t)
=> ("testib2c.log")

指示できるオプションは以下の通り.

  • absolute: 結果をフルパスで取得する.
  • recursive: サブディレクトリを検索する.
  • depth: recursive指定時の再帰の深さ.
  • wild: ワイルドカード指定.リストも可.
  • file-only: ファイルのみ検索.
  • directory-only: ディレクトリのみ検索.
  • show-dots: ディレクトリとして "./" と "../" を加える.
  • count: 表示されるファイルの個数を制限する.
  • callback: 見つかったファイルを引数にして funcall する.
  • file-info: ファイル属性を取得する.get-file-info で得られるものと同じ.

ディレクトリ内のファイル名のソート(大文字・小文字の区別あり)

(sort (directory "c:/cygwin") #'string<)
=> ("Cygwin.bat" "Cygwin.ico" "bin/" "cygdrive/" "dev/" "etc/" "home/" "lib/" "tmp/" "usr/" "var/")

ディレクトリ内のファイル名のソート(大文字・小文字の区別なし)

(sort (directory "c:/cygwin") #'string-lessp)
=> ("bin/" "cygdrive/" "Cygwin.bat" "Cygwin.ico" "dev/" "etc/" "home/" "lib/" "tmp/" "usr/" "var/")

ディレクトリかどうかを確認する

(file-directory-p "c:/temp")
=> t

ワイルドカードにマッチした全ファイルに対して処理を行う

(defun action-match (path action)
  (let ((dir (directory-namestring path)))
    (mapcar (lambda (f)
	      (let ((p (concat dir f)))
		(if (file-directory-p p)
		    nil
		  (funcall action p))))
	    (directory path))))
=> action-match

(action-match "c:/cygwin/cyg*" 'print)
=> "c:/cygwin/Cygwin.bat" 
   "c:/cygwin/Cygwin.ico" 
   (nil "c:/cygwin/Cygwin.bat" "c:/cygwin/Cygwin.ico")

ディレクトリ内の全ファイルに対して処理を行う

「ワイルドカードにマッチした全ファイルに対して処理を行う」で定義した action-match 関数を使う。

(action-match "c:/cygwin/*" 'print)

ディレクトリ内の全ファイルに対して処理を行う

Common Lisp のパス名では "**" という表現で任意の数のディレクトリにマッチさせることができる…はずが、xyzzy では動かない様子。

そこで次のようにする。

(defun action-match-recur (path action)
  (mapcar (lambda (f)
	    (let ((p (concat path f)))
	      (if (file-directory-p p)
		  (action-match-recur p action)
		(funcall action p))))
	  (directory path)))
=> action-match-recur

(action-match-recur "c:/cygwin/home/" 'print)
⚠️ **GitHub.com Fallback** ⚠️