[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
file.util
- ファイルシステムユーティリティ ファイルやディレクトリを扱う便利な手続き群を提供します。 これらの手続きはファイルシステムで述べられたプリミティブなシステム手続きの上に 構築されています。
このモジュール内の多くの手続きはfollow-link?というキーワード引数を取ります。
これは手続きがシンボリックリンクに出会ったときの動作を指定します。follow-link?が
真であれば、手続きはリンクの指す先のファイルに作用します。これがデフォルトの振舞いです。
follow-link?に#f
が渡された場合は手続きはリンクそのものに作用します。
名前つけ規則に関する注記:ファイルやディレクトリを
作成するのに"create"
という語を使う処理系と"make"
を
使う処理系があります。ファイルやディレクトリを削除するのにも"remove"
と
"delete"
の流派があります。どちらも同じくらい広く使われているようなので、
Gaucheでは両方の名前を提供することにしました。
11.11.1 ディレクトリユーティリティ | ||
11.11.2 パスネームユーティリティ | ||
11.11.3 ファイル属性ユーティリティ | ||
11.11.4 ファイル操作 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
引数無しで呼ばれた場合、カレントディレクトリを返します。 文字列new-directoryが与えられた場合はプロセスのカレントディレクトリを new-directoryに変更します。変更が出来なかった場合はエラーとなります。
この関数はChezSchemeやMzSchemeなどいくつかのScheme処理系に見られます。
名前または整数のユーザidで与えられたユーザuserのホームディレクトリを
返します。userが省略された場合はカレントユーザが使われます。
与えられたユーザが見付けられないか、ホームディレクトリを決定できなかった場合は
#f
が返されます。
一時ファイルを作るのに適したディレクトリ名を返します。
環境変数TMPDIR
が定義されていればその値を、
そうでなければ‘/tmp’を返すようになっています。
ディレクトリ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") |
directory-list
に似ていますが、ふたつの値を返します。最初の値は
path内にあるサブディレクトリのリストで、次の値はそれ以外のエントリのリストです。
キーワード引数children?、add-path?
、filterは
directory-list
と同じ意味をもちます。
偽の値をfollow-link?に与えると、path内のシンボリックリンクを 辿りません;すなわち、path内にディレクトリへのシンボリックリンクがあった場合、 デフォルト、もしくはfollow-link?に真の値が与えられた場合は それは最初のリスト(サブディレクトリ)に入りますが、follow-link? に偽の値が与えられた場合は後者のリスト(その他のエントリ)に入ります。
ディレクトリ探索の最も基本的な手続きです。基本的な動作は以下に示すような再帰的なものです。
(proc path seed)
を
評価し、結果を返します。
directory-fold
が各パス名に対して再帰的に呼ばれます。
各呼び出しの結果が次の再帰呼び出しのseedの値に使われます。
デフォルトのlisterはdirectory-list
を次のように呼び出すものです。
(lambda (path seed) (values (directory-list path :add-path? #t :children? #t) seed)) |
listerはpath自身への参照 ("."
) やその親ディレクトリへの参照を
返してはなりません。また、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)))) |
ディレクトリnameを作成します。nameに至るパスが存在しない
場合は必要なディレクトリが作成されます (Unixのmkdir -p
コマンドと
同様です)。ディレクトリnameが既に存在していた場合は何もしません。
permは作成されるディレクトリのパーミッションビットを指定します。
ディレクトリnameとその内容を再帰的に消去します
(Unixのrm -r
コマンドと同様です)。シンボリックリンクは辿られません。
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
を参照してください。
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を指すシンボリックリンクを作成します。
specで記述されるディレクトリ階層がdirの下に存在するかどうかを
調べ、存在すれば#t
、そうでなければ#f
を返します。
specの形式は上で説明したcreate-directory-tree
と同じです。
specがオプションを含んでいる場合、該当するファイル/ディレクトリの 属性もそのオプションに合致するかどうかチェックされます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
パス名のコンポーネントcomponentをbase-pathに追加します。
Componentはシンボルup
またはsame
であっても
構いません; Unixではそれらは".."
または"."
と等価です。
このAPIはMzSchemeから採られました。
pathがそれぞれ絶対パスまたは相対パスならば#t
を返します。
pathがチルダ表記を含んでいたらそれを展開したものを返します。 そうでなければpathそのものを返します。この手続きはpathが 存在しアクセス可能であるかどうかはチェックしません。
pathをexpand-path
と同様に展開し、
続いてpathの各コンポーネントに対してそれがシンボリックリンクであればリンク先の
ものに置き換えてゆきます。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 |
それぞれ、pathの拡張子と、pathから拡張子を除いたものを返します。
pathが拡張子を持っていない場合はそれぞれ#f
とpathが返されます。
(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" |
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" |
名前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] | [ ? ] |
これらの手続きはpathで示されるファイルやディレクトリのアトリビュートを
返します。アトリビュート名は<sys-stat>
のスロット名に対応しています。
ファイルの状態を参照して下さい。pathで示されるファイルが
存在しなければ#f
が返されます。
pathがシンボリックリンクだった場合、オプショナルな引数 follow-link? に偽の値が与えられていない限り、これらの手続きは リンクの指す先のファイルに関する情報を返します。
MzSchemeとChickenにはfile-size
があります。
Chickenにはfile-modification-time
があり、これはfile-mtime
と
同じです。
pathが存在して、現在の実効ユーザがそれぞれ読み取り/書き込み/実行可能なら#t
を
返します。
このAPIはSTkから取られました。
pathが存在して、それがシンボリックリンクなら#t
を返します。
(参照:ファイルの状態のfile-is-regular?
, file-is-directory?
).
path1とpath2で示されるファイルを比較します。
file-eq?
とfile-eqv?
はpath1とpath2が
全く同一のファイルを参照しているかどうか、すなわち、同じデバイス上にあり同じ
inode番号を持つかどうかをチェックします。二つの手続きの違いは、
path1
やpath2の最後のコンポーネントがシンボリックリンクで
あった場合に、file-eq?はリンクそのものの比較をするが
file-eqv?
はリンクを辿った先のファイルの比較をする、という点です。
file-equal?
はpath1とpath2をその内容まで考慮して比較します。
すなわち、二つのファイルがfile-eqv?
の意味で同一でなかった場合、
file-equal?
はファイルの内容を比較し、全てが一致した場合に#t
を返します。
path1とpath2ともにディレクトリが与えられた場合の
file-equal?
の動作は未定義です。将来、ディレクトリ内容を
スキャンするような拡張が加えられるかもしれません。
二つのファイルの変更時間を比較します。それぞれの引数に対して、 次のような型のオブジェクトが渡せるようなメソッドが定義されています。
<sys-stat>
オブジェクト (See section ファイルの状態)。
stat構造体から変更時間が取られます。
<time>
オブジェクト。その示す時間が変更時間と考えられます。
;; "foo.c" より "foo.o" が新しいかどうか調べる (file-mtime>? "foo.c" "foo.o") ;; "foo.log"が過去24時間以内に更新されたかどうかを調べる (file-mtime>? "foo.c" (- (sys-time) 86400)) |
file-mtime=?
と同じですが、ファイルの属性変更時間とアクセス時間に
関して比較します。
<
, <=
, >
, >=
を使う関数も同様に定義されています。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
pathもしくはリストpaths中の各パスの
タイムスタンプを現在の時刻に更新します。
指定されたパスが存在しなかった場合はその名前で大きさゼロのファイルが作成されます。
ファイルの状態のsys-utime
も参照して下さい。
ファイルsrcをdstへコピーします。コピー元ファイルsrcは 存在していなければなりません。コピー先ファイルdstが存在していた場合の ふるまいはキーワード引数if-existsによって以下のように指定されます。
:error
(デフォルト) dstが存在していたらエラーを通知する。
:supersede
dstをsrc
のコピーで置き換える。
: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セッティングによってマスクされた
値となります。
ファイルsrcをdstへ移動します。移動元ファイルsrcは 存在していなければなりません。移動先ファイルdstが存在した場合の ふるまいはキーワード引数if-existsによって以下のように指定されます。
:error
(デフォルト) dstが存在していたらエラーを通知する。
:supersede
dstをsrc
で置き換える。
:backup
dstの名前を変えてキープする。
#f
dstが存在していたら移動をせず#f
を返す。
move-file
は移動が完了したら#t
を返します。
if-existsが:backup
である場合、dstがリネームされる
名前はdstにキーワード引数backup-suffixで指定されるサフィックスを
付けたものとなります。デフォルト値は".orig"
です。
ファイルsrcとdstは別のファイルシステム上にあっても構いません。
その場合、move-file
はまずsrcをdstと同じディレクトリの
一時ファイルにコピーし、それをdstにリネームし、それから
srcを消去します。
リストpaths中の各パスを削除します。パスがファイルの場合は
unlink
し、ディレクトリの場合はremove-directory*
を
使って再帰的にその内容を消去します。存在しないパスは単に無視されます。
delete-files
はremove-files
の別名です。
ファイル filename から読み込むための便利手続き。
これらの手続きは、まず、指定された名前のファイルをオープンし、その
オープンしたファイルに対してそれぞれ port->string
、
port->list
、port->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.