[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11 file.util - ファイルシステムユーティリティ

Module: file.util

ファイルやディレクトリを扱う便利な手続き群を提供します。 これらの手続きはファイルシステムで述べられたプリミティブなシステム手続きの上に 構築されています。

このモジュール内の多くの手続きはfollow-link?というキーワード引数を取ります。 これは手続きがシンボリックリンクに出会ったときの動作を指定します。follow-link?が 真であれば、手続きはリンクの指す先のファイルに作用します。これがデフォルトの振舞いです。 follow-link?#fが渡された場合は手続きはリンクそのものに作用します。

名前つけ規則に関する注記:ファイルやディレクトリを 作成するのに"create"という語を使う処理系と"make"を 使う処理系があります。ファイルやディレクトリを削除するのにも"remove""delete"の流派があります。どちらも同じくらい広く使われているようなので、 Gaucheでは両方の名前を提供することにしました。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11.1 ディレクトリユーティリティ

Function: current-directory &optional new-directory

引数無しで呼ばれた場合、カレントディレクトリを返します。 文字列new-directoryが与えられた場合はプロセスのカレントディレクトリを new-directoryに変更します。変更が出来なかった場合はエラーとなります。

この関数はChezSchemeやMzSchemeなどいくつかのScheme処理系に見られます。

Function: home-directory &optional user

名前または整数のユーザidで与えられたユーザuserのホームディレクトリを 返します。userが省略された場合はカレントユーザが使われます。 与えられたユーザが見付けられないか、ホームディレクトリを決定できなかった場合は #fが返されます。

Function: temporary-directory

一時ファイルを作るのに適したディレクトリ名を返します。 環境変数TMPDIRが定義されていればその値を、 そうでなければ‘/tmp’を返すようになっています。

Function: directory-list path &keyword children? add-path? filter filter-add-path?

ディレクトリpath中のエントリのリストを返します。 リストは文字列順にソートされます。

デフォルトではエントリのベースネーム(パスの最後のコンポーネント)のみが 返されますが、キーワード引数add-path?に真の値が与えられた時は pathが各エントリの前に追加されます。 children?に真の値が与えられた時は、カレントディレクトリと親ディレクトリが リストから除かれます。

filter引数は、もし与えられれば、一つの引数を取る 手続きでなければなりません。ディレクトリ中の各エントリを引数としてその手続きが呼ばれ、 真を返したエントリのみが結果に含まれます。 filterに与えられるエントリはデフォルトではベース名のみですが、 引数filter-add-path?が真ならばpathが前に追加された名前となります。

pathがディレクトリでない場合はエラーが報告されます。

 
(directory-list "test")
 ⇒ ("." ".." "test.scm" "test.scm~")

(directory-list "test" :add-path? #t)
 ⇒ ("test/." "test/.." "test/test.scm" "test/test.scm~")

(directory-list "test" :children? #t)
 ⇒ ("test.scm" "test.scm~")

(directory-list "test" :children? #t :add-path? #t
   :filter (lambda (e) (not (string-suffix? "~" e))))
 ⇒ ("test/test.scm")
Function: directory-list2 path &keyword children? add-path? filter follow-link?

directory-listに似ていますが、ふたつの値を返します。最初の値は path内にあるサブディレクトリのリストで、次の値はそれ以外のエントリのリストです。 キーワード引数children?add-path?filterdirectory-listと同じ意味をもちます。

偽の値をfollow-link?に与えると、path内のシンボリックリンクを 辿りません;すなわち、path内にディレクトリへのシンボリックリンクがあった場合、 デフォルト、もしくはfollow-link?に真の値が与えられた場合は それは最初のリスト(サブディレクトリ)に入りますが、follow-link? に偽の値が与えられた場合は後者のリスト(その他のエントリ)に入ります。

Function: directory-fold path proc seed &keyword lister follow-link?

ディレクトリ探索の最も基本的な手続きです。基本的な動作は以下に示すような再帰的なものです。

デフォルトのlisterdirectory-listを次のように呼び出すものです。

 
(lambda (path seed)
  (values (directory-list path :add-path? #t :children? #t)
          seed))

listerpath自身への参照 (".") やその親ディレクトリへの参照を 返してはなりません。また、listerの戻り値は現在のディレクトリからアクセス可能な パス名でなければなりません。例えばpath"/usr/lib/foo"であり、 そのディレクトリが"libfoo.a""libfoo.so"を含んでいた場合、 lister'("/usr/lib/foo/libfoo.a" "/usr/lib/foo/libfoo.so") のようなリストを返す必要があります。

キーワード引数follow-link?はディレクトリを指しているシンボリックリンクに対して listerを呼ぶかどうかを決定します。follow-link?が真(デフォルト値)である 場合はそのようなシンボリックリンクに対してもlisterが呼ばれます。 一方、follow-link?が偽であればシンボリックリンクに対してはprocが呼ばれます。

次の例は、与えられたpath以下からemacsのバックアップファイル ("~"で終る名を持つファイル) のリストを返します。

 
(use srfi-13) ;; for string-suffix?
(directory-fold path
                (lambda (entry result) 
                  (if (string-suffix? "~" entry)
                      (cons entry result)
                      result))
                '())

次の例は与えられたpath以下全てのファイルとディレクトリ名をリストにして 返します。lister引数を使ってディレクトリ名そのものを結果に 含めていることに注目して下さい。

 
(directory-fold path cons '()
  :lister (lambda (path seed)
            (values (directory-list path :add-path? #t :children? #t)
                    (cons path seed))))
Function: make-directory* name &optional perm
Function: create-directory* name &optional perm

ディレクトリnameを作成します。nameに至るパスが存在しない 場合は必要なディレクトリが作成されます (Unixのmkdir -pコマンドと 同様です)。ディレクトリnameが既に存在していた場合は何もしません。 permは作成されるディレクトリのパーミッションビットを指定します。

Function: remove-directory* name
Function: delete-directory* name

ディレクトリnameとその内容を再帰的に消去します (Unixのrm -rコマンドと同様です)。シンボリックリンクは辿られません。

Function: copy-directory* src dst &keyword if-exists backup-suffix safe keep-timestamp keep-mode follow-link?

srcが通常のファイルであれば、copy-fileと同じように その内容をdstにコピーします。しかしsrcがディレクトリの場合は、 再帰的にディレクトリを辿り、その全てをdstへとコピーします。 cp -rコマンドに相当するものだと考えて良いでしょう。

srcがディレクトリの場合、デフォルトではその下にあるシンボリックリンクは 辿られず、リンクそのものがコピーされます。リンク先の内容をもコピーしたい 場合はfollow-link?キーワード引数に真の値を与えてください。 つまり、follow-link?キーワード引数のデフォルト値は#fです。 (このデフォルト値はcopy-fileと逆であることに注意してください。 copy-fileではfollow-link?はデフォルトで真であり、 リンクそのものをコピーしたい場合に明示的に#fを与える必要があります。)

他のキーワード引数の意味はcopy-fileと同じです。 詳細はcopy-fileを参照してください。

Function: create-directory-tree dir spec

specで指定されるディレクトリツリーをdirの下に作成します。 特定のディレクトリ構造を一気にセットアップする際に便利です。

spec引数は次に示される構造をもつS式です。

 
<spec> : <name>                             ; 空のファイル
       | (<name> <option> ...)              ; 空のファイル
       | (<name> <option> ... <string>)     ; 固定内容のファイル
       | (<name> <option> ... <procedure>)  ; 内容を生成するファイル
       | (<name> <option> ... (<spec> ...)) ; ディレクトリ

<name> : 文字列かシンボル

<option> ... : キーワードと値の交代リスト

specの最初と2番目の形式では、名前nameを持つ空のファイルが作られます。 3番目の形式では与えられた文字列がファイルの内容となります。

4番目の形式では、手続きがファイルのパス名を引数として呼び出され、 その手続きがcurrent output portに出力した内容がファイルの内容となります。 引数に渡されるパス名はdir引数からの相対パスです。 手続きが呼ばれる時、その親ディレクトリは既につくられています。

最後の形式は、名前nameを持つディレクトリを作成し、 その子供として再帰的に指定されたspecによるファイル/ディレクトリを作成します。

optionによって、作られるファイル/ディレクトリの属性を細かく指定できます。 今のところ、次のオプションが認識されます。

:mode mode

整数modeでパーミッションのモードビットを指定します。

:owner uid
:group gid

整数uid/gidで作成されるエントリのオーナー/グループを指定します。 作成されるエントリのオーナー/グループを変更するには、 呼び出すプロセスに特権が必要かもしれません。

:symlink path

ファイルを作成するspecでのみ有効なオプションで、 pathを指すシンボリックリンクを作成します。

Function: check-directory-tree dir spec

specで記述されるディレクトリ階層がdirの下に存在するかどうかを 調べ、存在すれば#t、そうでなければ#fを返します。

specの形式は上で説明したcreate-directory-treeと同じです。

specがオプションを含んでいる場合、該当するファイル/ディレクトリの 属性もそのオプションに合致するかどうかチェックされます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11.2 パスネームユーティリティ

Function: build-path base-path component …

パス名のコンポーネントcomponentbase-pathに追加します。 Componentはシンボルupまたはsameであっても 構いません; Unixではそれらは".."または"."と等価です。 このAPIはMzSchemeから採られました。

Function: absolute-path? path
Function: relative-path? path

pathがそれぞれ絶対パスまたは相対パスならば#tを返します。

Function: expand-path path

pathがチルダ表記を含んでいたらそれを展開したものを返します。 そうでなければpathそのものを返します。この手続きはpathが 存在しアクセス可能であるかどうかはチェックしません。

Function: resolve-path path

pathexpand-pathと同様に展開し、 続いてpathの各コンポーネントに対してそれがシンボリックリンクであればリンク先の ものに置き換えてゆきます。pathが存在しないパスを指していたり、 シンボリックリンクの先が存在しなかったり、読み出せないディレクトリがあった場合は エラーとなります。

Function: simplify-path path

pathから、親ディレクトリへの参照("..")と自分自身への参照(".")を 出来る限り取り除きます。この手続きはファイルシステムへはアクセスしません。

Function: decompose-path path

パス名pathのディレクトリ部、拡張子を除いたファイル名、 そして拡張子の3つの値を返します。パス名が拡張子を持たない場合、 最後の値は#fになります。パス名がディレクトリセパレータで 終わっている場合は2番目と3番目の値が#fになります。 (後置されたディレクトリセパレータに関するこの取扱いは、 sys-dirname/sys-basenameと異なることに注意して下さい。 sys-dirname等は後置されたディレクトリセパレータを無視するという シェル等の慣習に従っています。)

 
(decompose-path "/foo/bar/baz.scm")
  ⇒ "/foo/bar", "baz", "scm"
(decompose-path "/foo/bar/baz")
  ⇒ "/foo/bar", "baz", #f

(decompose-path "baz.scm")
  ⇒ ".", "baz", "scm"
(decompose-path "/baz.scm")
  ⇒ "/", "baz", "scm"

;; Boundary cases
(decompose-path "/foo/bar/baz.")
  ⇒ "/foo/bar", "baz", ""
(decompose-path "/foo/bar/.baz")
  ⇒ "/foo/bar", ".baz", #f
(decompose-path "/foo/bar.baz/")
  ⇒ "/foo/bar.baz", #f, #f
Function: path-extension path
Function: path-sans-extension path

それぞれ、pathの拡張子と、pathから拡張子を除いたものを返します。 pathが拡張子を持っていない場合はそれぞれ#fpathが返されます。

 
(path-extension "/foo/bar.c")       ⇒ "c"
(path-sans-extension "/foo/bar.c")  ⇒ "/foo/bar"

(path-extension "/foo/bar")         ⇒ #f
(path-sans-extension "/foo/bar")    ⇒ "/foo/bar"
Function: path-swap-extension path newext

pathの拡張子がnewextに置換されたものが返されます。pathが 拡張子を持たない場合は、pathに "." とnewextが追加されます。

newext#fの場合は、pathの拡張子が除かれたものが 返されます。すなわち、

 
(path-swap-extension "/foo/bar.c" "o")  ⇒ "/foo/bar.o"
(path-swap-extension "/foo/bar.c" #f)   ⇒ "/foo/bar"
Function: find-file-in-paths name &keyword paths pred

名前nameを持ち、述語predを満たすファイルをパス名のリストpaths から探します。見つかった場合はファイルの絶対パス名を、見つからなかった場合は #fを返します。

nameが絶対パス名で与えられた場合はそれが存在するかどうかと predを満たすかどうかのみがチェックされます。

pathsのデフォルト値は環境変数PATHから取られます。また、 predのデフォルト値はfile-is-executable? (ファイル属性ユーティリティ参照)です。すなわち、デフォルトでは この手続きはコマンドサーチパスから実行可能ファイルを探すのに使えます。

 
(find-file-in-paths "ls")
  ⇒ "/bin/ls"

;; アプリケーション"myapp"のユーザプレファレンスファイルを探す例
(find-file-in-paths "userpref"
  :paths `(,(expand-path "~/.myapp")
           "/usr/local/share/myapp"
           "/usr/share/myapp")
  :pred  file-is-readable?)

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11.3 ファイル属性ユーティリティ

Function: file-type path &keyword follow-link?
Function: file-perm path &keyword follow-link?
Function: file-mode path &keyword follow-link?
Function: file-ino path &keyword follow-link?
Function: file-dev path &keyword follow-link?
Function: file-rdev path &keyword follow-link?
Function: file-nlink path &keyword follow-link?
Function: file-uid path &keyword follow-link?
Function: file-gid path &keyword follow-link?
Function: file-size path &keyword follow-link?
Function: file-atime path &keyword follow-link?
Function: file-mtime path &keyword follow-link?
Function: file-ctime path &keyword follow-link?

これらの手続きはpathで示されるファイルやディレクトリのアトリビュートを 返します。アトリビュート名は<sys-stat>のスロット名に対応しています。 ファイルの状態を参照して下さい。pathで示されるファイルが 存在しなければ#fが返されます。

pathがシンボリックリンクだった場合、オプショナルな引数 follow-link? に偽の値が与えられていない限り、これらの手続きは リンクの指す先のファイルに関する情報を返します。

MzSchemeとChickenにはfile-sizeがあります。 Chickenにはfile-modification-timeがあり、これはfile-mtimeと 同じです。

Function: file-is-readable? path
Function: file-is-writable? path
Function: file-is-executable? path

pathが存在して、現在の実効ユーザがそれぞれ読み取り/書き込み/実行可能なら#tを 返します。 このAPIはSTkから取られました。

Function: file-is-symlink? path

pathが存在して、それがシンボリックリンクなら#tを返します。 (参照:ファイルの状態file-is-regular?, file-is-directory?).

Function: file-eq? path1 path2
Function: file-eqv? path1 path2
Function: file-equal? path1 path2

path1path2で示されるファイルを比較します。 file-eq?file-eqv?path1path2が 全く同一のファイルを参照しているかどうか、すなわち、同じデバイス上にあり同じ inode番号を持つかどうかをチェックします。二つの手続きの違いは、 path1path2の最後のコンポーネントがシンボリックリンクで あった場合に、file-eq?はリンクそのものの比較をするが file-eqv?はリンクを辿った先のファイルの比較をする、という点です。

file-equal?path1path2をその内容まで考慮して比較します。 すなわち、二つのファイルがfile-eqv?の意味で同一でなかった場合、 file-equal?はファイルの内容を比較し、全てが一致した場合に#tを返します。

path1path2ともにディレクトリが与えられた場合の file-equal?の動作は未定義です。将来、ディレクトリ内容を スキャンするような拡張が加えられるかもしれません。

Generic Function: file-mtime=? f1 f2
Generic Function: file-mtime<? f1 f2
Generic Function: file-mtime<=? f1 f2
Generic Function: file-mtime>? f1 f2
Generic Function: file-mtime>=? f1 f2

二つのファイルの変更時間を比較します。それぞれの引数に対して、 次のような型のオブジェクトが渡せるようなメソッドが定義されています。

 
;; "foo.c" より "foo.o" が新しいかどうか調べる
(file-mtime>? "foo.c" "foo.o")

;; "foo.log"が過去24時間以内に更新されたかどうかを調べる
(file-mtime>? "foo.c" (- (sys-time) 86400))
Generic Function: file-ctime=? f1 f2
Generic Function: file-atime=? f1 f2

file-mtime=?と同じですが、ファイルの属性変更時間とアクセス時間に 関して比較します。 <, <=, >, >=を使う関数も同様に定義されています。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11.4 ファイル操作

Function: touch-file path
Function: touch-files paths

pathもしくはリストpaths中の各パスの タイムスタンプを現在の時刻に更新します。 指定されたパスが存在しなかった場合はその名前で大きさゼロのファイルが作成されます。 ファイルの状態sys-utimeも参照して下さい。

Function: copy-file src dst &keyword if-exists backup-suffix safe keep-timestamp keep-mode follow-link?

ファイルsrcdstへコピーします。コピー元ファイルsrcは 存在していなければなりません。コピー先ファイルdstが存在していた場合の ふるまいはキーワード引数if-existsによって以下のように指定されます。

:error

(デフォルト) dstが存在していたらエラーを通知する。

:supersede

dstsrcのコピーで置き換える。

:backup

dstの名前を変えてキープする。

#f

dstが存在していたらコピーをせず#fを返す。

copy-fileはコピーが完了したら#tを返します。

srcがシンボリックリンクであった場合、copy-fileは デフォルトでリンクを辿ります。つまり、ファイルの実体がコピーされます。 srcが存在しないパスを指すシンボリックリンクであった場合は エラーが通知されます。

キーワード引数follow-link?#fを与えることで、 copy-linkにシンボリックリンクそのものをコピーさせることも できます。この場合、srcが存在しないパスを指すシンボリックリンクで あっても構いません。

if-exists:backupである場合、 dstがリネームされる名前は dstにキーワード引数backup-suffixで指定されるサフィックスを 付けたものとなります。デフォルト値は".orig"です。

デフォルトではcopy-fileは直接dstにコピーを行いますが、 キーワード引数safeに真の値が与えられた場合は、dstと同じディレクトリ 内の一時ファイルにまずコピーし、それが完了した時点でdstへとリネームします。 コピーが何らかの理由で中断された場合、ファイルシステムはコピー前の状態へと 「ロールバック」されます。

キーワード引数keep-timestampに真の値が与えられた場合は、 copy-fileはコピー後にコピー先のファイルのタイムスタンプを コピー元のタイムスタンプに合わせます。

キーワード引数keep-modeに真の値が与えられた場合は、 コピー先のファイルのパーミッションビットはコピー元のそれに合わせられます。 keep-modeが偽の場合(デフォルト)は、コピー先が既に存在して safe引数が偽の場合にコピー先のもとのパーミッションが保持され、 そうでなければ#o666がumaskセッティングによってマスクされた 値となります。

Function: move-file src dst &keyword if-exists backup-suffix

ファイルsrcdstへ移動します。移動元ファイルsrcは 存在していなければなりません。移動先ファイルdstが存在した場合の ふるまいはキーワード引数if-existsによって以下のように指定されます。

:error

(デフォルト) dstが存在していたらエラーを通知する。

:supersede

dstsrcで置き換える。

:backup

dstの名前を変えてキープする。

#f

dstが存在していたら移動をせず#fを返す。

move-fileは移動が完了したら#tを返します。

if-exists:backupである場合、dstがリネームされる 名前はdstにキーワード引数backup-suffixで指定されるサフィックスを 付けたものとなります。デフォルト値は".orig"です。

ファイルsrcdstは別のファイルシステム上にあっても構いません。 その場合、move-fileはまずsrcdstと同じディレクトリの 一時ファイルにコピーし、それをdstにリネームし、それから srcを消去します。

Function: remove-files paths
Function: delete-files paths

リストpaths中の各パスを削除します。パスがファイルの場合は unlinkし、ディレクトリの場合はremove-directory*を 使って再帰的にその内容を消去します。存在しないパスは単に無視されます。

delete-filesremove-filesの別名です。

Function: file->string filename options …
Function: file->list reader filename options …
Function: file->string-list filename options …
Function: file->sexp-list filename options …

ファイル filename から読み込むための便利手続き。 これらの手続きは、まず、指定された名前のファイルをオープンし、その オープンしたファイルに対してそれぞれ port->stringport->listport->string-list および port->sexp-list を呼びます(入力ユーティリティ手続き参照)。すべての内容が読み込まれる かまたは読み込み中にエラーシグナルがあがれば、ファイルはクローズされます。

これらの手続きはcall-with-input-fileと同じキーワード引数を取ります。 ファイルが見つからなかった場合の振舞いは キーワード引数:if-does-not-existによって指定できます。 それが:errorならエラーが報告され、 #fなら#fが返されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.