Next: , Up: ファイルの情報   [Contents][Index]


26.6.1 アクセシビリティのテスト

以下の関数はファイルにたいする読み取り、書き込み、実行のパーミッションをテストします。これらの関数は明示しない限りボリックリンクをフォローします。ファイル種別の区別を参照してください。

いくつかのオペレーティングシステムではACL(Access Control Lists: アクセス制御リスト)のような機構を通じて、より複雑なアクセスパーミッションセットが指定できます。それらのパーミッションにたいする問い合わせやセットの方法については拡張されたファイル属性を参照してください。

Function: file-exists-p filename

この関数はファイル名filenameが存在しているようならtをリターンする。これはファイルが読み取り可能である必要はなく、ファイルの属性を調べることが恐らく可能なこと意味する(Unixやその他のPOSIXシステム類ではファイルが存在してファイルを含むディレクトリーの実行パーミッションをもつ場合にはファイル自体のパーミッションに関わらずt)。

ファイルが存在しない、またはファイルが存在するかどうかの判断に問題があるようなら、この関数はnilをリターンする。

ディレクトリーはファイルなので、ディレクトリーが与えられるとfile-exists-ptをリターンするかもしれない。しかしfile-exists-pはシンボリックリンクをフォローするので、ターゲットファイルが存在する場合のみシンボリックリンク名にたいしてtをリターンする。

Function: file-readable-p filename

この関数はfilenameという名前のファイルが存在して、それを読み取ることが可能ならt、それ以外はnilをリターンする。

Function: file-executable-p filename

この関数は、filenameという名前のファイルが存在して、それを実行することが可能ならtをリターンする。それ以外はnilをリターンする。Unixやその他のPOSIXシステム類ではファイルがディレクトリーなら実行パーミッションはディレクトリー内のファイルの存在と属性をチェックできるので、ファイルのモードが許せばオープンできることを意味する。

Function: file-writable-p filename

この関数はfilenameという名前のファイルが書き込み可能か作成可能可能ならt、それ以外はnilをリターンする。ファイルが存在してそれに書き込むことができるならファイルは書き込み可能。ファイルは存在しないが親ディレクトリーが存在して、そのディレクトリーに書き込むことができるなら書き込み可能。

以下の例では、fooは親ディレクトリーが存在しないので、たとえユーザーがそのディレクトリーを作成可能であってもファイルは書き込み可能ではない。

(file-writable-p "~/no-such-dir/foo")
     ⇒ nil
Function: file-accessible-directory-p dirname

この関数はファイルとしての名前がdirnameであるようなディレクトリー内にある既存のファイルをオープンするパーミッションをもつ場合はt、それ以外(そのようなディレクトリーが存在しない場合)はnilをリターンする。dirnameの値はディレクトリー名(/foo/など)、または名前がディレクトリー(最後のスラッシュがない/fooなど)であるようなファイル。

たとえば以下では/foo/内の任意のファイルを読み取る試みはエラーになると推測できる:

(file-accessible-directory-p "/foo")
     ⇒ nil
Macro: with-existing-directory body…

このマクロはbody実行前にdefault-directoryが存在するディレクトリーにバインドされていることを保証する。すでにdefault-directoryが存在していれば優先し、存在していなければ何処か別のディレクトリーを使用する。このマクロはたとえば存在するディレクトリー内での実行を要する外部コマンド呼び出し時に有用かもしれない。選択されるディレクトリーへの書き込み権限は保証しない。

Function: access-file filename string

この関数はfilenameが読み取り可能ならnil、それ以外ならstringをエラーメッセージのテキストに使用してエラーをシグナルする。

Function: file-ownership-preserved-p filename &optional group

この関数はファイルfilenameを削除後に新たに作成してもファイルの所有者が変更されずに維持されるようならtをリターンする。これは存在しないファイルにたいしてもtをリターンする。

オプション引数groupが非nilなら、この関数はファイルのグループが変更されないこともチェックする。

この関数はシンボリックリンクをフォローしない。

Function: file-modes filename &optional flag

この関数はfilenameモードビット(mode bits)をリターンする。これは読み取り、書き込み、実行パーミッションを要約する整数。この関数はシンボリックリンクを許容する。ファイルが存在しなければリターン値はnil

モードビットの説明はFile permissions in The GNU Coreutils Manualを参照のこと。たとえば最下位ビットが1ならそのファイルは実行可能、2ビット目が1なら書き込み可能、...となる。設定できる最大の値は4095(8進の7777)であり、これはすべてのユーザーが読み取り、書き込み、実行のパーミッションをもち、他のユーザーとグループにたいしてSUIDビット、およびstickyビットがセットされる。

デフォルトでは、この関数はシンボリックリンクをフォローする。しかしオプション引数flagがシンボルnofollowなら、この関数はシンボリックリンクのfilenameをフォローしない。これはどこか別の場所でうっかりモードビットを取得してしまうことを防ぎ、file-attributesとの整合性を保つ助けとなり得る(ファイルの属性を参照)。

これらのパーミッションのセットに使用されるset-file-modes関数についてはファイルの名前と属性の変更を参照のこと。

(file-modes "~/junk/diffs" 'nofollow)
     ⇒ 492               ; 10進整数
(format "%o" 492)
     ⇒ "754"             ; 8進に変換した値

(set-file-modes "~/junk/diffs" #o666 'nofollow)
     ⇒ nil

$ ls -l diffs
-rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs

MS-DOSにたいする注意: MS-DOSでは実行可能であることをを表すようなファイルのモードビットは存在しない。そのためfile-modesはファイル名が.com.bat.exeなどのような標準的な実行可能な拡張子のいずれかで終わる場合にはファイルを実行可能であると判断する。POSIX標準の‘#!’署名で始まるshellスクリプトやPerlスクリプトも実行可能と判断される。POSIXとの互換性のためにディレクトリーも実行可能と報告される。file-attributes (ファイルの属性を参照)もこれらの慣習にしたがう。