以下の関数はファイルにたいする読み取り、書き込み、実行のパーミッションをテストします。これらの関数は明示しない限りボリックリンクをフォローします。ファイル種別の区別を参照してください。
いくつかのオペレーティングシステムではACL(Access Control Lists: アクセス制御リスト)のような機構を通じて、より複雑なアクセスパーミッションセットが指定できます。それらのパーミッションにたいする問い合わせやセットの方法については拡張されたファイル属性を参照してください。
この関数はファイル名filenameが存在しているようならt
をリターンする。これはファイルが読み取り可能である必要はなく、ファイルの属性を調べることが恐らく可能なこと意味する(Unixやその他のPOSIXシステム類ではファイルが存在してファイルを含むディレクトリーの実行パーミッションをもつ場合にはファイル自体のパーミッションに関わらずt
)。
ファイルが存在しない、またはファイルが存在するかどうかの判断に問題があるようなら、この関数はnil
をリターンする。
空文字列であるようなファイル名はカレントバッファーのデフォルトディレクトリーから相対的なファイル(絶対ファイル名と相対ファイル名を参照)と解釈されるので、引数に空文字列を指定してfile-exists-p
を呼び出すとそのバッファーのデフォルトディレクトリーについてレポートされることになる。
ディレクトリーはファイルなので、ディレクトリーが与えられるとfile-exists-p
はt
をリターンするかもしれない。しかしfile-exists-p
はシンボリックリンクをフォローするので、リンクのターゲットが存在する場合のみシンボリックリンク名にたいしてt
をリターンする。Lispプログラムにおいて既存のファイルとしてターゲットが存在しない壊れたシンボリックリンク(dangling
symlinks)を考慮する必要がある場合には、file-exists-p
ではなくfile-attributes
(ファイルの属性を参照)を使うこと。
この関数はfilenameという名前のファイルが存在して、それを読み取ることが可能ならt
、それ以外はnil
をリターンする。
この関数は、filenameという名前のファイルが存在して、それを実行することが可能ならt
をリターンする。それ以外はnil
をリターンする。Unixやその他のPOSIXシステム類ではファイルがディレクトリーなら実行パーミッションはディレクトリー内のファイルの存在と属性をチェックできるので、ファイルのモードが許せばオープンできることを意味する。
この関数はfilenameという名前のファイルが書き込み可能か作成可能可能ならt
、それ以外はnil
をリターンする。ファイルが存在してそれに書き込むことができるならファイルは書き込み可能。ファイルは存在しないが親ディレクトリーが存在して、そのディレクトリーに書き込むことができるなら書き込み可能。
以下の例では、fooは親ディレクトリーが存在しないので、たとえユーザーがそのディレクトリーを作成可能であってもファイルは書き込み可能ではない。
(file-writable-p "~/no-such-dir/foo") ⇒ nil
この関数はファイルとしての名前がdirnameであるようなディレクトリー内にある既存のファイルをオープンするパーミッションをもつ場合はt
、それ以外(そのようなディレクトリーが存在しない場合)はnil
をリターンする。dirnameの値はディレクトリー名(/foo/など)、または名前がディレクトリー(最後のスラッシュがない/fooなど)であるようなファイル。
たとえば以下では/foo/内の任意のファイルを読み取る試みはエラーになると推測できる:
(file-accessible-directory-p "/foo") ⇒ nil
このマクロはbody実行前にdefault-directory
が存在するディレクトリーにバインドされていることを保証する。すでにdefault-directory
が存在していれば優先し、存在していなければ何処か別のディレクトリーを使用する。このマクロはたとえば存在するディレクトリー内での実行を要する外部コマンド呼び出し時に有用かもしれない。選択されるディレクトリーへの書き込み権限は保証しない。
この関数はfilenameが読み取り可能ならnil
、それ以外ならstringをエラーメッセージのテキストに使用してエラーをシグナルする。
If the user option remote-file-name-access-timeout
is a positive
number, the function signals an error when it doesn’t finish after that time
(in seconds). This applies only to remote files, and only when there is no
additional time spent while reading passwords or alike.
この関数はファイルfilenameを削除後に新たに作成してもファイルの所有者が変更されずに維持されるようならt
をリターンする。これは存在しないファイルにたいしてもt
をリターンする。
オプション引数groupが非nil
なら、この関数はファイルのグループが変更されないこともチェックする。
この関数はシンボリックリンクをフォローしない。
この関数は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
(ファイルの属性を参照)もこれらの慣習にしたがう。