Next: Truenames, Previous: Testing Accessibility, Up: Information about Files [Contents][Index]
このセクションでは、ディレクトリー、シンボリックリンク、および通常ファイルのような、さまざまな種類のファイルを区別する方法を説明します。
ファイルfilenameがシンボリックリンクの場合、file-symlink-p
関数は(非再帰的な)リンクターゲットを文字列としてリターンする(リンクターゲット文字列は、そのターゲットの完全な絶対ファイル名である必要はない。リンクが指すのが完全なファイル名か判断するのは、簡単な処理ではない。以下を参照されたい)。filenameのディレクトリー部分(leading
directory)にシンボリックリンクが含まれる場合、この関数はそれらを再帰的にフォローする。
ファイルfilenameがシンボリックリンクではない、または存在しない場合、file-symlink-p
はnil
をリターンする。
この関数の使用例をいくつか示す:
(file-symlink-p "not-a-symlink") ⇒ nil
(file-symlink-p "sym-link") ⇒ "not-a-symlink"
(file-symlink-p "sym-link2") ⇒ "sym-link"
(file-symlink-p "/bin") ⇒ "/pub/bin"
3つ目の例では、関数はsym-linkをリターンするものの、たとえそれ自体がシンボリックリンクであっても、リンク先の解決を行わないことに注意されたい。これが上述した“非再帰的(non-recursive)”の意味するところであり、シンボリックリンクをフォローする処理は、そのリンクターゲット自体がリンクの場合、再帰的には行われない。
この関数がリターンするのは、そのシンボリックリンクに何が記録されているかを示す文字列であり、それにはディレクトリー部分が含まれていても、いなくても構わない。この関数は完全修飾されたファイル名を生成するためにリンクターゲットを展開しないし、リンクターゲットが絶対ファイル名でなければ、(もしあっても)filename引数のディレクトリー部分は使用しない。以下に例を示す:
(file-symlink-p "/foo/bar/baz") ⇒ "some-file"
ここでは、たとえ与えられた/foo/bar/bazが完全修飾されたファイル名であるにも関わらず、その結果は異なり、実際には何のディレクトリー部分ももたない。some-file自体がシンボリックリンクかもしれないので、単にその前に先行ディレクトリーを追加することはできず、絶対ファイル名を生成するために、単にexpand-file-name
(File Name Expansionを参照)を使用することもできないからである。
この理由により、あるファイルがシンボリックリンクか否かという単一の事実よりも多くを判定する必要がある場合に、この関数が有用であることは稀である。実際にリンクターゲットのファイル名が必要な場合は、Truenamesで説明するfile-chase-links
またはfile-truename
を使用すること。
以下の2つの関数は、filenameにたいして、シンボリックリンクを全階層において再帰的にフォローする。
この関数は、filenameが既存のディレクトリー名ならt
、それ以外はnil
をリターンする。
(file-directory-p "~rms") ⇒ t
(file-directory-p "~rms/lewis/files.texi") ⇒ nil
(file-directory-p "~rms/lewis/no-such-file") ⇒ nil
(file-directory-p "$HOME") ⇒ nil
(file-directory-p (substitute-in-file-name "$HOME")) ⇒ t
この関数は、ファイルfilenameが存在し、かつそれが通常ファイル(ディレクトリー、名前付きパイプ、端末、その他I/Oデバイス以外)の場合はt
をリターンする。