@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. 
@c See the file elisp-jp.texi for copying conditions.
@c 複製の条件は elisp-jp.texi に書いてあります。
@c 95/11/04 4:03
@setfilename ../info/files-jp
@clear jp-draft
@node Files, Backups and Auto-Saving, Documentation, Top
@comment  node-name,  next,  previous,  up
@chapter ファイル

Emacsでは、ファイルとファイル・ディレクトリに対し、探索する、新規作成する、
ながめる、保存する、などの作業ができます。本章ではEmacs lispのファイル
に関係する関数のうちの大部分のものを説明しますが、@ref{Buffers}で説明して
いるのもあります。また、バックアップや自動セーブに関連する関数は、
@ref{Backups and Auto-Saving}で説明しています。

ファイル関数の多くは、
引数として一つないしはそれ以上の数のファイル名を取ります。
ファイル名とは、実際には文字列のことです。
これらの関数のほとんどは、@code{expand-file-name}を使ってファイル名を
展開します。これにより相対ファイル名(@samp{../}を含む)を取り扱うように、
@file{~}を正しく取り扱います。これらの関数は@samp{$HOME}などの環境変数の
置換は行ないません。@xref{File Name Expansion}。

@menu
* Visiting Files::           編集のためにEmacsのバッファにファイルを読み込む
* Saving Buffers::           変更されたバッファをファイルに書き込む
* Reading from Files::       visitすることなくバッファにファイルを読み込む
* Writing to Files::         バッファの一部分を新しいファイルに書き込む
* File Locks::               同時に二人の人間が同一ファイルを修正するのを
                        　　  防ぐためにファイルをロック、アンロックする
* Information about Files::  ファイルの存在、アクセス可能性、サイズ、の検査
* Changing File Attributes:: ファイル名の変更、 プロテクション変更、など
* File Names::               ファイル名の分解、展開
* Contents of Directories::  あるディレクトリの中にあるファイルのリストを得る
* Create/Delete Dirs::  　　 ディレクトリの作成、削除
* Magic File Names::         あるファイル名に対する"魔法の"特別の扱い
                             を定義する
* Format Conversion::       さまざまなファイル・フォーマットへ/からの変換
* Files and MS-DOS::         MS-DOS上のテキスト・ファイルとバイナリ・ファイルの区別
@end menu

@node Visiting Files
@section ファイルをvisitする
@cindex finding files
@cindex visiting files
@cindex みつける、ファイルを[みつける、ふぁいるを]
@cindex visitする、ファイルを[visitする、ふぁいるを]


ファイルをvisitするとは、バッファにファイルを読み込むことを意味します。
visitを一度した後は、バッファがそのファイルを
@dfn{visitしている(visiting)}といい、
そのファイルを、バッファにより``visitされているファイル''と呼びます。

ファイルとバッファは二つの異なったものです。
ファイルはコンピュータの中に(消さないかぎりは)ずっと記録されている情報です。
一方バッファは、Emacsの内部的な情報であり、Emacsの編集のセッションが
終ったとき(あるいはバッファをkillしたとき)にはなくなってしまうものです。
通常、バッファはあなたがファイルからコピーした情報を持っています。
このとき、そのバッファはファイルをvisitしているといいます。
バッファ中のコピーに対して、あなたは編集のコマンドを使って編集をします。
そのようなバッファに対しての修正は、ファイルには反映されません。
ですから、その変更点をファイルに反映させるには、バッファを@dfn{保存(save)}
しなければなりません。それは変更されたバッファの内容を、ファイルにコピー
しなおすことを意味します。

ファイルとバッファには以上のような違いがあるのですが、バッファを意味して
いるときにファイルのことを言及してみたり、またこの逆の場合があったりとい
うことがあります。実際、
``私はバッファを編集していて、すぐに同じ名前をもつファイルとして保存します''
という言い方よりはむしろ、``私はファイルを編集しています''という言い方を
します。
人は通常この区別を明示的にする必要はありません。しかし、コンピュータ・
プログラム中でファイル、バッファを扱うときは、この区別を念頭に置くとよい
でしょう。

@menu
* Visiting Functions::         visitための通常のインタフェース関数
* Subroutines of Visiting::   そのインタフェース関数が使用する、低レベル関数
@end menu

@node Visiting Functions
@subsection ファイルをvisitするための関数

@ifset jp-dfaft
  This section describes the functions normally used to visit files.
For historical reasons, these functions have names starting with
@samp{find-} rather than @samp{visit-}.  @xref{Buffer File Name}, for
functions and variables that access the visited file name of a buffer or
that find an existing buffer by its visited file name.
@end ifset
本節では、ファイルをvisitするのに通常使われる関数について説明します。
歴史的な理由により、これらの関数は@samp{visit-}で始まる名前ではなく、
@samp{find-}で始まる名前を持ちます。バッファがvisitしているファイルの名前に
アクセスする、あるいは、ファイルの名前から存在するバッファをみつける関数と
変数については@xref{Buffer File Name}。

Lispプログラムで、ファイルの中身は見たいが、変更はしたくない場合、
最も手っ取り早い方法は、一時バッファで@code{insert-file-contents}を
使うことです。ファイルをvisitする必要はなく、visitする方が時間もかかります。
@xref{Reading from Files}。

@deffn Command find-file filename
このコマンドは、ファイル@var{filename}をvisitするバッファを選択します。
これは、そのようなバッファがある場合には、それを使用し、
もしなければ新しいバッファを作り、そのファイルを読み込みます。
またこのコマンドは、そのバッファを返値として返します。

@code{find-file}の本体はとても単純で、以下のようになっています。

@example
(switch-to-buffer (find-file-noselect filename))
@end example

@noindent
(@ref{Displaying Buffers}の@code{switch-to-buffer}を参照。)

@code{find-file}が対話的に呼ばれたときは、ミニバッファにおいて
@var{filename}の入力を促します。

@end deffn

@defun find-file-noselect filename
この関数は、ファイルをvisitする関数すべてのもととなるものです。
これは、ファイル@var{filename}をvisitするバッファをみつけるか、あるいは新しく
作成して、そのバッファを返します。
この関数は、そのバッファがすでに存在するものであれば、それを使い、
そうでなければ新しいバッファを作って、そこにファイルを読み込みます。
あなたが望めば、そのバッファをカレント・バッファにできるし、
またウィンドウにそのバッファを表示できますが、この関数自身はそれはしません。

@code{find-file-noselect}が、
すでに存在するバッファを使用するときは、まず最初に、そのファイルがその
バッファにおいて最後にvisit、あるいは保存されてから、変更がないことを確認
します。変更がある場合には、この関数は、ユーザに対し、その変更前の元の
ファイルを読み込み直すかどうかを尋ねます。ユーザが、この質問に@samp{yes}
と答えた場合、それまでにそのバッファにしたすべての変更は失われます。

もし@code{find-file-noselect}が、バッファを新規に作成する必要があり、
かつ@var{filename}という名前のファイルが存在しない場合、エコー領域に
@samp{New file}というメッセージを表示し、バッファの内容を空のままにします。

@code{find-file-noselect}関数は、ファイルを読み込んだ後、
@code{after-find-file}を呼び出します(@pxref{Subroutines of Visiting})。
この関数は、バッファの主モードを設定し、ローカル変数を構文解析し、
今現在visitしているファイルよりも、新しく自動セーブされた
ファイルが存在する場合には警告をユーザに出し、最後に、
@code{find-file-hooks}の中の関数を起動します。

@code{find-file-noselect}関数は、ファイル@var{filename}をvisitしている
バッファを返値として返します。

@example
@group
(find-file-noselect "/etc/fstab")
     @result{} #<buffer fstab>
@end group
@end example
@end defun

@ignore
@deffn Command find-alternate-file filename
This command selects a buffer visiting the file @var{filename}, then
kills the buffer that was previously displayed in the selected window.
It is useful if you have visited the wrong file by mistake, so that you
can get rid of the buffer that you did not want to create, at the same
time as you visit the file you intended.

@deffn Command find-alternate-file filename
このコマンドは、ファイル@var{filename}をvisitするバッファを選択します。
そのとき、選択されていたウィンドウに表示されていたバッファはkillします。
このコマンドは、もし間違って違うファイルをvisitしてしまったときには便利です。
これは、望んだファイルをvisitするときと同時に、あなたが作りたくなかった
バッファを消去することができるからです。

When this command is called interactively, it prompts for @var{filename}.

このコマンドが対話的に呼ばれた場合、@var{filename}の入力をユーザに促します。
@end ignore

@deffn Command find-file-other-window filename
このコマンドはファイル@var{filename}をvisitするバッファを選択しますが、
現在選択されているウィンドウ以外のウィンドウ内で選択します。
このコマンドは、ほかの存在するウィンドウを使用するかもしれませんし、一つの
ウィンドウを分割するかもしれません。@ref{Displaying Buffers}を参照のこと。

このコマンドが対話的に呼ばれた場合、@var{filename}の入力をユーザに促します。
@end deffn

@deffn Command find-file-read-only filename
このコマンドは、@code{find-file}と同様、ファイル@var{filename}をvisit
するバッファを選択しますが、この関数はバッファを読出し専用とします。
関連する関数および変数は、@xref{Read Only Buffers}。

このコマンドが対話的に呼ばれた場合、@var{filename}の入力をユーザに促します。
@end deffn

@deffn Command view-file filename
このコマンドはViewモードで@var{filename}をvisitし、このコマンドの終了後には、
前に存在したバッファに戻るように、再帰編集の状態でファイルを表示
します。Viewモードはファイルをざっと眺めるためのモードで、
編集はさせません。Viewモードに入ると、正規フック@code{view-mode-hook}
を起動します。@xref{Hooks}。

@ignore
@c ver 2.3
@deffn Command view-file filename
このコマンドはViewモードで@var{filename}をvisitし、visitが終了したとき、
visit以前のバッファに戻ります。Viewモードは、ファイルをざっと眺める
ためのモードで、バッファの修正はできません。
Viewモードにはいるときには、正規フック@code{view-mode-hook}を起動します。
@ref{Hooks}を参照のこと。
@end ignore

@code{view-file}が対話的に呼ばれた場合、@var{filename}の入力をユーザに
促します。
@end deffn

@defvar find-file-hooks
この変数の値は、ファイルがvisitされたあとに呼ばれる関数のリストです。
(もしあるなら)ファイルのローカル変数の仕様は、フックを走らせる前に
処理されます。このフック関数が起動されるとき、ファイルをvisitしている
バッファが、カレント・バッファです。

この変数は、正規フックのように動作しますが、しかしこの変数名を変えてしまう
のは、おすすめできません。
@end defvar

@defvar find-file-not-found-hooks
この変数の値は、@code{find-file}ないしは@code{find-file-noselect}が
存在しないファイルに対して呼ばれたとき、呼び出される関数のリストです。
@code{find-file-noselect}は、ファイルが存在しないことを確認すると、
すぐにこれらの関数を呼び出します。この関数は、リストの要素を、
順に非@code{nil}を返す関数があるまで呼ばれます。@code{buffer-file-name}は、
すでに設定されています。

関数の返値が使用され、その関数すべてが呼び出されないかもしれないので、
これは正規フックではありません。
@end defvar

@node Subroutines of Visiting
@comment  node-name,  next,  previous,  up
@subsection visitのためのサブルーチン

@code{find-file-noselect}関数は、@code{create-file-buffer}と
@code{after-find-file}関数をサブルーチンとして使います。
それらを直接的に呼び出すことは、時には便利な場合もあります。

@defun create-file-buffer filename
この関数は、@var{filename}をvisitするために、適切に名づけられたバッファを
作成し、そのバッファを返値として返します。
この関数は、前にバッファ名として使われたものでないなら、
(ディレクトリ部分なしで)@var{filename}をそのままバッファの名前として
使用します。
そうでなければ、@samp{<2>}のような文字列をくっつけて、前に使用されていない
名前を作り出します。@ref{Creating Buffers}も参照のこと。

@strong{注意:} 
@code{create-file-buffer}は、ファイルとその作成された新しいバッファを
関係づけるものでは@emph{ありません}。またバッファの選択も行ないません。
またこの関数は、デフォルトの主モードを使いません。

@example
@group
(create-file-buffer "foo")
     @result{} #<buffer foo>
@end group
@group
(create-file-buffer "foo")
     @result{} #<buffer foo<2>>
@end group
@group
(create-file-buffer "foo")
     @result{} #<buffer foo<3>>
@end group
@end example

この関数は、@code{find-file-noselect}によって使われます。
この関数は、@code{generate-new-buffer}を使います。
(@pxref{Creating Buffers})
@end defun

@defun after-find-file &optional error warn
この関数は、バッファの主モードを設定し、ローカル変数を構文解析します
(@pxref{Auto Major Mode})。この関数は、@code{find-file-noselect}と、
デフォルトの復帰の関数より呼ばれます(@pxref{Reverting})。

@cindex new file message
@cindex file open error
@cindex 新しいファイル・メッセージ[あたらしいふぁいるめっせーじ]
@cindex ファイル・オープン・エラー[ふぁいるおーぷんえらー]
ファイル読み込み時に、ファイルは存在しないが、ディレクトリは存在して
エラーを引き起こした場合には、呼び出し側は@var{error}に非@code{nil}値
をわたすべきです。この場合、@code{after-find-file}は、警告のメッセージを
出します。@samp{(New File)}。より深刻なエラーの場合には、呼び出し側は、
@code{after-find-file}を呼び出すべきではありません。

@var{warn}が非@code{nil}の場合、この関数は、自動セーブ・ファイルが存在し、
それがvisitされるファイルより新しく作成されたものならば、警告の
メッセージを出します。

最後に、@code{after-find-file}は、@code{find-file-hooks}中のすべての関数を
呼び出します。
@end defun

@node Saving Buffers
@section バッファを保存する

あなたがEmacsでファイルを編集しているときは、実際は、そのファイルをvisit
しているバッファに対して作業を行っています。すなわち、そのファイルの中味が
バッファにコピーされ、そのコピーに対して編集作業をしているのです。
そのバッファの内容に対する変更は、あなたがバッファを@dfn{保存(save)}するまで
実際のファイルに反映されません。この保存というのは、バッファの内容を
ファイルに対してコピーするということです。

@deffn Command save-buffer &optional backup-option
この関数は、カレント・バッファの内容が、最後にvisitあるいは保存されてから
修正されている場合に、そのバッファの内容をvisitされているファイルに
保存します。そうでない場合はなにもしません。

@code{save-buffer}は、バックアップ・ファイルの作成に関して責任を持ちます。
通常、@var{backup-option}は@code{nil}であり、ファイルをvisitしてから
最初に保存するときのみ、@code{save-buffer}はバックアップ・ファイルを作成します。
@var{backup-option}にほかの値を与えた場合、
それはほかの状態でバックアップ・ファイルの作成をするよう要求したことに
なります。

@itemize @bullet
@item
一回ないしは三回@kbd{C-u}を押して、
それに対応して与えられる引数が4あるいは64になる場合、
@code{save-buffer}関数は、そのバッファが次に
保存されたときに、ファイルのこのバージョンのバックアップをとるように記録します。

@item
二回、ないしは三回@kbd{C-u}を押して、
それに対応して与えられる引数が16ないしは64になる場合、
この関数は、そのファイルを保存する前に、
前のバージョンのバックアップを無条件でとります。
@end itemize
@end deffn

@deffn Command save-some-buffer &optioanl save-silently-p exiting
このコマンドはファイルをvisitしているバッファで修正されたものの複数のもの
を対象にして保存を行ないます。通常、このコマンドはユーザに対し、
それぞれのバッファに対して確認を求めます。しかし、@var{save-silently-p}が
非@code{nil}である場合には、ファイルをvisitしているすべてのバッファを、
ユーザに確認をせず保存します。

オプションの@var{exiting}引数は、非@code{nil}の場合、ファイルをvisit
していないほかのバッファも保存するように、この関数に要求します。
これらの対象となるバッファは、@code{buffer-offer-save}の値として、
非@code{nil}であるローカル値をもつバッファです(これらの対象バッファに対して、
保存するかどうかの質問にyesと答えた場合、ファイル名を
聞かれます)。@code{save-buffers-kill-emacs}関数は、この引数に対して
非@code{nil}の値を渡します。
@end deffn

@defvar buffer-offer-save
Emacsは、バッファでこの変数が非@code{nil}のとき、そのバッファがファイルを
visitしていない場合でも、Emacs終了時に保存をするような機能を提供します。
この変数は、自動的にすべてのバッファでローカルな変数です。通常、Mail
モード(送信するメールを編集するのに使われます)ではこの変数を@code{t}に
設定します。
@end defvar

@deffn Command write-file filename
この関数は、カレント・バッファをファイル@var{filename}に書き込み、
バッファがそのファイルをvisitしているものと設定し、そのバッファを修正がない
ものとして記録します。
そのとき、バッファの名前を唯一なものにする必要があれば、
バッファの名前を@var{filename}をベースとして、@samp{<2>}などの文字列を
あとに付加して名前を変えます。
この関数は、この作業の大部分を
@code{set-visited-file-name}、@code{save-buffer}を呼び出して行ないます。
@end deffn

@defvar write-file-hooks
この変数の値は、バッファの内容をvisitされているファイルに書き込む前に
呼び出される関数のリストです。そのリストの要素の一つが、非@code{nil}を
返した場合、そのファイルをすでに書込みがされたものとして扱い、
リストの残りの要素は呼び出さず、またファイル書込みのために
通常使われるコードは実行しません。

@code{write-file-hooks}中の関数が非@code{nil}を返した場合、
その関数はバックアップ・ファイルの作成に(もしそれが適切なものならば)
責任を持ちます。これを実行するために、以下のコードを実行してください。

@example
(or buffer-backed-up (backup-buffer))
@end example

あなたは@code{backup-buffer}が返すファイル・モードの値を保存したいかも
しれません。そして、あなたが書き込むファイルに対し、モード・ビットを
設定するために、それを使いたいかもしれません。これは@code{save-buffer}が
通常行っていることです。

これは正規フックではないのですが、このリストを取り扱うのに
@code{add-hook}と@code{remove-hook}を使うことができます。@xref{Hooks}。
@end defvar

@c Emacs 19 の特徴
@defvar local-write-file-hooks
これはちょうど@code{write-file-hooks}のように働きます。
しかしこれは特定のバッファにローカルなことをさせるためのフックです。
バッファローカルなことをするのに@code{write-file-hooks}を使うのは
よい考えではありません。その代わりにこの変数を使ってください。

この変数はつねにバッファローカルなものですので、
主モードを変えても、バッファローカルな値は変わりません。
この変数は、特別な方法で``ファイル''の中味を読み込み、
それに対応する方法でそのデータを保存するためのフックをセットするような
パッケージにとって便利です。
@end defvar

@c Emacs 19 の特徴
@defvar write-contents-hooks
これはちょうど@code{write-file-hooks}のように働きます。
しかしこのフックは、ファイルがどういう属性のものかということに関係するフック
に対応させて、ファイルの中身に関係するものとして使われることを意識された
フックです。
このようなフックは、通常主モードが設定を行ない、バッファローカルな
束縛をします。
新しい主モードに変わるときは、つねにこの変数をリセットします。
@end defvar

@c Emacs 19 の特徴
@defvar after-save-hook
この正規フックは、バッファの内容がそのvisitされているファイルに保存
されたあとに起動されるフックです。
@end defvar

@defvar file-precious-flag
この変数が非@code{nil}の場合、@code{save-buffer}は、そのファイルがもつことに
なっていた名前の代わりに一時的な新しい名前で保存し、そしてエラーがないこと
がわかった後に、予定していた名前にそのファイルの名前替えをする、という処理の
間に発生するI/Oエラーからファイルを保護します。
この手続きは、不適切なファイルで、ディスク空間が不足するような場合に
発生する問題点を回避します。

副作用として、バックアップは必ずコピーで実行されます。@xref{Rename or Copy}。
また同時に、貴重なファイルを保存することは、その保存する
ファイルとそのほかの別名の間のハードリンクをつねに壊すことになります。

いくつかのモードは、この変数に対して特定のバッファでローカルに
非nilを設定します。
@end defvar

@defopt require-final-newline
この変数は、改行でファイルが終わら@emph{ない}ように
ファイルを書き込むかどうかを決めるものです。
もし変数の値が@code{t}ならば、@code{save-buffer}は保存されるバッファが
そのときに改行で終わってないときは、常にそのファイルの終わりに改行を確認なしに
加えます。
@code{save-buffer}は、もしこの変数の値が非@code{nil}であるが
@code{t}でない場合、改行を加えるような場合が発生するごとに、
ユーザに確認を求めます。

もしその変数の値が@code{nil}ならば、@code{save-buffer}は改行
を全く加えません。@code{nil}がこの変数に対するデフォルトの値ですが、
主モードの中には、特定のバッファで@code{t}を設定するものもあります。
@end defopt

@node Reading from Files
@comment  node-name,  next,  previous,  up
@section ファイルからの読込み

@code{insert-file-contents}関数を使って、ディスクからファイルをコピーし、
バッファのなかにそのファイルを挿入することができます。ユーザレベル・コマンド
@code{insert-file}は、内部で印づけをするため、Lispプログラムの中では
使用してはいけません。

@defun insert-file-contents filename &optional visit beg end replace
この関数は、カレント・バッファのポイントの後にファイル
@var{filename}の内容を挿入します。
この関数は、そのファイルの絶対ファイル名と、
挿入されたデータ長のリストを返します。@var{filename}が読み出すことのできる
ファイルの名前でない場合は、エラーを発生します。

関数@code{insert-file-contents}は、このファイルの内容に対して、
定義されたファイル・フォーマットでチェックを行ないます。
それが適切ならば、ファイルの内容を変換します。
@xref{Format Conversion}。
またこの関数は、リスト@code{after-insert-file-functions}の関数を
呼び出します。@ref{Saving Properties}を参照のこと。

もし@var{visit}が非@code{nil}ならば、この関数はさらに、バッファを修正が
ないものとしてマークし、バッファ中のさまざまなフィールドをセットして、
ファイル@var{filename}をvisitしているように設定します。これらのフィールドと
しては、バッファのvisitされているファイル名、最後に保存されたときの
ファイルの修正時間などの情報があります。この特徴は、@code{find-file-noselect}
が使用し、ほとんどの場合においては、ユーザ自身からは使用すべきではありません。

もし@var{beg}と@var{end}が非@code{nil}ならば、これらは、挿入されるファイル
の部分を決める整数です。この場合、@var{visit}は@code{nil}でなけ
ればなりません。たとえば、

@example
(insert-file-contents filename nil 0 500)
@end example

@noindent
はファイルの最初の500文字を挿入します。

もし引数@var{replace}が非@code{nil}ならば、バッファの内容(実際はアクセス
可能な部分のみ)をファイルの内容で置き換えることを意味します。
これは、単純にバッファの内容を削除し、ファイルの全内容を挿入する、という
方法よりよい方法です。というのはこの関数は、
(1)いくつかのマーカの位置を保存する、
(2)undoリストに入るデータの量が少ない、
という利点があるからです。
@end defun

もしほかのプログラムがそのファイルを読むことができるように、ほかのプロセスに
ファイル名を渡したいならば、関数@code{file-local-copy}を使用してください。
@ref{Magic File Names}を参照のこと。

@node Writing to Files
@comment  node-name,  next,  previous,  up
@section ファイルへの書込み

@code{append-to-file}と@code{write-region}関数を使用して、
バッファの内容全部ないしは一部を、直接ディスク上のファイルとして
書き込むことができます。
これらの関数を、現在visitしているファイルに書込みを行なうのに
使用してはいけません。使用した場合、visitのメカニズムに混乱を引き起こす
可能性があります。

@deffn Command append-to-file start end filename
この関数は、カレント・バッファ中の@var{start}と@var{end}で囲まれたリージョンの
内容を、@var{filename}の終わりに追加書き込みします。もしそのようなファイルが
存在しない場合、新規に作成されます。この関数は@code{nil}を返します。

もし@var{filename}が、書き込み可能でないファイル、ないしは
ファイル作成ができないディレクトリの中の存在しないファイルをさしていた場合、
エラーを発生します。
@end deffn

@deffn Command write-region start end filename &optional append visit
この関数は、カレント・バッファの@var{start}と@var{end}で囲まれたリージョンを、
@var{filename}で指定されたファイルに書き込みます。

@c Emacs 19 の特徴
もし@var{start}が文字列ならば、@code{write-region}はバッファからの
テキストでなく、その文字列自身を書き込み、ないしは追加書き込みします。

もし@var{apeend}が非@code{nil}ならば、その指定されたテキストは
(もしあるならば)存在するファイルの内容に追加書き込みされます。

もし@var{visit}が@code{t}ならば、Emacsはバッファとファイルとの間に
関連性を確立します。そのときこのバッファは、そのファイルをvisitしている
ことになります。
この関数はまた、@var{filename}の修正時刻に、カレント・バッファの
最後のファイル修正の時刻をセットします。
そしてそのバッファが修正がないものとして記録します。
この特徴は@code{save-buffer}が使用しますが、
ユーザはほとんどの場合この特徴を使用すべきではありません。

@c Emacs 19 の特徴
もし@var{visit}が文字列ならば、これはvisitするファイル名を指定します。
これにより、データをあるファイル(@var{filename})に書き込み、
一方でバッファは、別のファイル(@var{visit})をvisitしているとして
記録することができます。
引数@var{visit}はエコー領域メッセージに使用され、またファイル・ロックの
ためも使われます。
@var{visit}は@code{buffer-file-name}に記録されます。
この特徴は、@code{file-precious-flag}を実装するのに使用されます。
ユーザは本当に自分が何をしているのかが知りたいのでなければ、
この特徴は使用してはいけません。

関数@code{write-region}は、@code{buffer-file-format}で指定されている
場合に、適切なファイル・フォーマットにそのデータを変換します。
@xref{Format Conversion}。
またこの関数は、リスト@code{write-region-annotate-functions}の関数を
呼び出します。@ref{Saving Properties}を参照のこと。

通常、@code{write-region}は、メッセージ@samp{Wrote file @var{filename}}を
エコー領域に表示します。
もし、@var{visit}が@code{t}あるいは@code{nil}あるいは文字列のどれでも
ないならば、このメッセージの表示はされません。
この特徴は、内部の目的のためで、ユーザがそれについて知る必要が
ないようなファイルを使うプログラムを作成する場合に便利です。
@end deffn

@node File Locks
@section ファイルのロック
@cindex lock, file
@cindex file locks
@cindex ロック、ファイルの[ろっく、ふぁいるの]
@cindex ファイルのロック[ふぁいるのろっく]

二人のユーザが同時に同じファイルを編集する場合、お互いに干渉してしまう
可能性があります。
Emacsは、ファイルが修正されているときに、
@dfn{ファイル・ロック(file lock)}を記録して、
このような状況が発生するのを回避しようとします。
これによりEmacsは、ほかのEmacsジョブによりロックされているファイルが
バッファにvisitされて修正されようとするのを、
その最初の時点で検出することができ、ユーザにどのようにするか確認を求めます。

ファイル・ロックは、NFSのように、複数のマシンがファイル・システムを
共有している場合には正しく機能しません。
おそらく将来にはよりよいファイル・ロック・システムが実装されることでしょう。
ファイル・ロックが機能しないときには、二人のユーザにより、同時に一つの
ファイルを修正をすることは可能にはなってしまうのですが、
Emacsはこの場合も、2番目に保存をしようとするユーザに注意を促します。
また、そのファイルがディスク上で変更されている場合に、その元ファイルを
visitしているバッファが修正されているのを検出する機構は、
同時編集のケースを発見することができる場合があります。
@ref{Modification Time}を参照。

@defun file-locked-p filename
この関数は、ファイル@var{filename}がこのEmacsプロセスによりロックされて
いない場合には@code{nil}を返します。
このEmacsによってロックされている場合は、@code{t}を返し、
ほかのユーザによってロックされている場合には、そのユーザの名前を返します。

@example
@group
(file-locked-p "foo")
     @result{} nil
@end group
@end example
@end defun

@defun lock-buffer  &optional filename
この関数は、カレント・バッファが修正されている場合には、
ファイル@var{filename}を
ロックします。この引数@var{filename}は、カレント・バッファのvisitしている
ファイルがデフォルトです。もしカレント・バッファが、ファイルを
visitしていない、あるいは修正がない場合には、なにもしません。
@end defun

@defun unlock-buffer
この関数は、カレント・バッファが修正されている場合に、そのバッファでvisitして
いるファイルをアンロックします。バッファが修正されていない場合には、
その対応するファイルはロックされるべきではないので、
この関数はなにもしません。
カレント・バッファがファイルをvisitしていない場合もなにもしません。
@end defun

@defun ask-user-about-lock file other-user
この関数は、ユーザが@var{file}を修正しようとしたが、ほかの@var{other-user}
という名前の別のユーザによりロックされている場合に呼ばれます。
この関数が返す値により、次に何が起こるかが決まります。

@itemize @bullet
@item
@code{t}の場合、ファイルのロックを獲得したということを意味します。
このとき、このユーザはファイルを編集するかもしれません。
@var{other-user}はロックを失います。

@item
@code{nil}の場合、ロックを無視し、このユーザにそのファイルを
何らかの方法で編集させる、ということを意味します。

@item
@kindex ファイルがロックされた
この関数は、代わりに@code{file-locked}エラーを発生するかもしれません。
この場合は、ユーザがそれまでにしようとした変更は実行されません。

このエラーの場合のエラー・メッセージは以下のようになります。

@example
@error{} File is locked: @var{file} @var{other-user}
@end example

@noindent
ここで、@var{file}はファイルの名前であり、@var{other-user}は、
そのファイルをロックしているユーザ名です。
@end itemize

この関数のデフォルトの定義は、ユーザに何をするかについての選択を
促すことです。よって望むならば、@code{ask-user-about-lock}を、
あなた自身が作成したほかの決定をするバージョンのもので置き換える
こともできます。この関数の通常の定義のコードは、
@file{userlock.el}に記述されています。
@end defun

@node Information about Files
@section ファイルについての情報

この節で説明する関数はすべて、ファイル名を表す文字列に対して作用します。
これらの関数の名前はみな単語@samp{file}で始まります。
これらの関数はすべて、実在するファイルあるいはディレクトリについての
情報を返します。
よって、これらの関数に対する引数は、ほかに注釈がなければ、
すべて実在するファイルあるいはディレクトリでなければなりません。

@menu
* Testing Accessibility::   与えられたファイルは可読か? 書き込み可能か?
* Kinds of Files::          ディレクトリか? シンボリック・リンクか?
* Truenames::               ファイル名からシンボリック・リンク部分を除去する
* File Attributes::         ファイルのサイズは?  別名は?  など
@end menu

@node Testing Accessibility
@comment  node-name,  next,  previous,  up
@subsection アクセス可能性をテストする
@cindex accessibility of a file
@cindex file accessibility
@cindex ファイルのアクセス可能性[ふぁいるのあくせすかのうせい]
@cindex アクセス可能性、ファイルの[あくせすかのうせい、ふぁいるの]

これらの関数は特定の方法でファイル・アクセスのパーミッションを検査します。

@defun file-exists-p filename
この関数は、@var{filename}の名前のファイルが存在するように見えるとき、
@code{t}を返します。これは、そのファイルがあなたにとって可読であることを
必ずしも意味しておらず、ファイルに付随する属性を参照することができる、と
いうだけです(Unixでは、ファイルが存在し、かつ、そのファイル自身のプロテ
クションに関係なく、あなたがそのファイルが含まれるディレクトリに対して
実行権をもっている場合には、これは正しいです)。

そのファイルが存在しない場合、あるいはアクセス制御が厳しく、
ファイルの属性を参照できないようになっている場合は、この関数は@code{nil}
を返します。
@end defun

@defun file-readable-p filename
この関数は、@var{filename}の名前をもつファイルが存在し、かつあなたが可読の
場合には@code{t}を返します。それ以外の場合、@code{nil}を返します。

@example
@group
(file-readable-p "files.texi")
     @result{} t
@end group
@group
(file-exists-p "/usr/spool/mqueue")
     @result{} t
@end group
@group
(file-readable-p "/usr/spool/mqueue")
     @result{} nil
@end group
@end example
@end defun

@c Emacs 19 の特徴
@defun file-executable-p filename
この関数は、@var{filename}の名前をもつファイルが存在し、かつ実行可能ならば、
@code{t}を返します。それ以外の場合は@code{nil}を返します。
そのファイルがディレクトリの場合で、実行パーミッションがあるということは、
そのディレクトリの中にあるファイルの存在と属性を確認することができ、
そのファイル自身は、ファイル・モードが許していれば、
オープンできるということを意味しています。
@end defun

@defun file-writable-p filename
この関数は、ファイル@var{filename}が書き込みができる、ないしは新規作成が
できるならば、@code{t}を返し、それ以外は@code{nil}を返します。
そのファイルは存在し、かつ書き込みができるならば、ファイルは書き込み可能です。
ファイルは存在しないが、指定したディレクトリは存在し、
かつそのディレクトリに書き込み可能ならば、ファイルは作成可能です。

以下の3番目の例の場合、@file{foo}は、親ディレクトリが存在しないために、
ユーザはそのディレクトリを作ることはできるかもしれませんが、
書き込み可能ではありません。

@example
@group
(file-writable-p "~/foo")
     @result{} t
@end group
@group
(file-writable-p "/foo")
     @result{} nil
@end group
@group
(file-writable-p "~/no-such-dir/foo")
     @result{} nil
@end group
@end example
@end defun

@c Emacs 19 の特徴
@defun file-accessible-directory-p dirname
この関数は、ファイル名として@var{dirname}の名前をもつディレクトリの中の
実在するファイルに対し、あなたがオープンできるパーミッションをもつ場合、
@code{t}を返します。それ以外の場合(あるいはそのようなディレクトリが存在
しない場合)、@code{nil}を返します。@var{dirname}の値は、ディレクトリ名
ないしはディレクトリのファイル名のどちらかであるかもしれません。

例:以下の実行結果のもとで、

@example
(file-accessible-directory-p "/foo")
     @result{} nil
@end example

@noindent
@file{/foo/}の中にあるファイルをどのように読み込もうとしても
エラーになります。
@end defun

@defun file-ownership-preserved-p filename
この関数は、ファイル@var{filename}を削除して次に新しく作成するときに、
ファイルの所有者が変わらない場合は、@code{t}を返します。
@end defun

@defun file-newer-than-file-p filename1 filename2
@cindex file age
@cindex file modification time
@cindex ファイルの年[ふぁいるのとし]
@cindex ファイルの修正時刻[ふぁいるのしゅうせいじこく]
この関数は、ファイル@var{filename1}がファイル@var{filename2}よりも新しいとき、
@code{t}を返します。@var{filename1}が存在しない場合、@code{nil}を返します。
@var{filename2}が存在しない場合、@code{t}を返します。

以下の例では、ファイル@file{aug-19}は、19日に書き込まれたファイルであり、
ファイル@file{aug-20}は、20日に書き込まれたファイルであり、ファイル
@file{no-file}は全く存在しないファイルを表わしているとします。

@example
@group
(file-newer-than-file-p "aug-19" "aug-20")
     @result{} nil
@end group
@group
(file-newer-than-file-p "aug-20" "aug-19")
     @result{} t
@end group
@group
(file-newer-than-file-p "aug-19" "no-file")
     @result{} t
@end group
@group
(file-newer-than-file-p "no-file" "aug-19")
     @result{} nil
@end group
@end example

@code{file-attributes}を使って、二つの数のリストという形式でファイル
の最終修正時刻を得ることができます。
@xref{File Attributes}。
@end defun

@node Kinds of Files
@comment  node-name,  next,  previous,  up
@subsection ファイルの種類の区別

この節は、さまざまな種類のファイルをどのように区別するかについて説明します。
そのファイルとは、ディレクトリ、シンボリック・リンク、通常ファイルです。

@defun file-symlink-p filename
@cindex symbolic links, file
@cindex file symbolic links
@cindex シンボリック・リンク、ファイルの[しんぼりっくりんく、ふぁいるの]
@cindex ファイルのシンボリック・リンク[ふぁいるのしんぼりっくりんく]
ファイル@var{filename}がシンボリック・リンクの場合、@code{file-symlink-p}
関数は、リンク元のファイル名を返します。
これはテキスト・ファイル名か、ディレクトリか、あるいはまたほかのシンボリック・リンクの名前かもしれませんし、あるいは存在しないファイル名かもしれません。

ファイル@var{filename}がシンボリック・リンクでない(あるいはそのような
ファイルがない)時には、@code{file-symlink-p}は@code{nil}を返します。

@example
@group
(file-symlink-p "foo")
     @result{} nil
@end group
@group
(file-symlink-p "sym-link")
     @result{} "foo"
@end group
@group
(file-symlink-p "sym-link2")
     @result{} "sym-link"
@end group
@group
(file-symlink-p "/bin")
     @result{} "/pub/bin"
@end group
@end example

@end defun

@defun file-directory-p filename
この関数は、@var{filename}が実在するディレクトリの名前の場合、@code{t}を
返します。そうでない場合、@code{nil}を返します。

@example
@group
(file-directory-p "~rms")
     @result{} t
@end group
@group
(file-directory-p "~rms/lewis/files.texi")
     @result{} nil
@end group
@group
(file-directory-p "~rms/lewis/no-such-file")
     @result{} nil
@end group
@group
(file-directory-p "$HOME")
     @result{} nil
@end group
@group
(file-directory-p
 (substitute-in-file-name "$HOME"))
     @result{} t
@end group
@end example
@end defun

@defun file-regular-p filename
この関数は、ファイル@var{filename}が存在し、かつ正規のファイル(ディレクトリ、
シンボリック・リンク、名前つきパイプ、端末、そのほかのI/Oデバイス、の
いずれでもないもの)である場合には、@code{t}を返します。
@end defun

@node Truenames
@subsection 実名
@cindex truename (of file)
@cindex 実名、ファイルの[じつめい、ふぁいるの]

@c Emacs 19 の特徴
　ファイルの@dfn{実名(truename)}は、シンボリック・リンクを
なくなるまでたどり、@samp{.},
@samp{..}の要素を展開した結果得られる名前です。厳密には、ファイルはただ一つ
の実名をもつとはかぎりません。つまり、あるファイルがもつ別個の実名の数は、
そのファイルに対するハード・リンクの数と同じです。しかし実名は、名前の
つけ方の多様性を生む原因となるシンボリック・リンクを取り除くので、
便利なものです。

@defun file-truename filename
関数@code{file-truename}は、ファイル@var{filename}の実名を返します。
これはシンボリック・リンクを、それがなくなるまでたどることにより
得られる名前です。引数は絶対ファイル名でなければなりません。
@end defun

関連する情報は　@xref{Buffer File Name}。

@node File Attributes
@comment  node-name,  next,  previous,  up
@subsection ファイルに関するそのほかの情報

この節では、ファイルの内容以外の詳細な情報を得るための関数について
説明します。この情報とは、アクセス・パーミッションを制御するモード・ビット、
所有者およびグループ番号、名前の数、inode数、サイズ、アクセス時間、
修正時間、などです。

@defun file-modes filename
@cindex permission
@cindex file attributes
@cindex パーミッション[ぱーみっしょん]
@cindex 属性、ファイルの[ぞくせい、ふぁいるの]
@cindex ファイルの属性[ふぁいるのぞくせい]
この関数は@var{filename}のモード・ビットを整数で返します。モード・ビットは
ファイル・パーミッションとも呼ばれ、通常のUnixの方式で、アクセス制御の方針を
指定します。もし最下位ビットが1ならば、そのファイルはすべてのユーザが実行可能
であり、2番目の下位ビットが1ならば、そのファイルはすべてのユーザが書き込み
可能である、などです。

返値として可能な最大値は4095(8進で7777)で、これはすべてのユーザが読込み、
書込み、実行パーミッションがあり、かつ、@sc{suid}ビットが他人とグループの
両方にセットされ、かつ、stickyビットがセットされていることを意味します。

@example
@group
(file-modes "~/junk/diffs")
     @result{} 492               ; @r{10進の整数}
@end group
@group
(format "%o" 492)
     @result{} "754"             ; @r{8進に変換}
@end group

@group
(set-file-modes "~/junk/diffs" 438)
     @result{} nil
@end group

@group
(format "%o" 438)
     @result{} "666"             ; @r{8進に変換}
@end group

@group
% ls -l diffs
  -rw-rw-rw-  1 lewis 0 3063 Oct 30 16:00 diffs
@end group
@end example
@end defun

@defun file-nlinks filename
この関数はファイル@var{filename}が持っている名前(つまりハード・リンク)の数
を返します。ファイルが存在しない場合、この関数は@code{nil}を返します。
シンボリック・リンクは、リンク元のファイルに対する名前とは解釈され
ないため、この関数に対し影響をおよぼさないことに注意してください。

@example
@group
% ls -l foo*
-rw-rw-rw-  2 rms       4 Aug 19 01:27 foo
-rw-rw-rw-  2 rms       4 Aug 19 01:27 foo1
@end group

@group
(file-nlinks "foo")
     @result{} 2
@end group
@group
(file-nlinks "doesnt-exist")
     @result{} nil
@end group
@end example
@end defun

@defun file-attributes filename
この関数はファイル@var{filename}の属性をリストとして返します。
指定されたファイルがオープンできない場合は、@code{nil}を返します。

返値のリストの要素は、以下に示す順序になります。

@enumerate 0
@item
ディレクトリに対しては@code{t}を、シンボリック・リンクに対しては文字列
(リンク元の名前)を、あるいはテキスト・ファイルに対しては@code{nil}を
返します。

@item
ファイルが持っている名前の数。別の名前、つまりハード・リンクは、
@code{add-name-to-file}関数を使って生成できます。
(@pxref{Changing File Attributes})

@item
ファイルの@sc{uid}。

@item
ファイルの@sc{gid}。

@item
最終アクセス時間で、これは二つの整数のリストです。
第一の整数は時間を表す数字の上位16ビットを持ち、
第二の整数はその下位16ビットを持ちます。
(これは@code{current-time}の値に似た書式です。@ref{Time of Day}を参照)

@item
(上と同様に)二つの整数のリストで表現された最終修正時間。

@item
(上と同様に)二つの整数のリストで表現された最終状態変更時間。

@item
バイト表現のファイルのサイズ。

@item
@samp{ls -l}の出力と同様の、10個の英文字ないしはダッシュの列で
表現されたファイルのモード。

@item
ファイルが削除されて再び作成される場合に、ファイルの@sc{gid}が変わるような
場合は、@code{t}を返します。それ以外は@code{nil}を返します。

@item
ファイルのinode番号。

@item
そのファイルが含まれるファイル・システムの、ファイル・システム番号。これと
inode番号により、そのシステム上の任意の二つのファイルを区別できます。
すなわち、これらの番号の両方が同じ値であるような二つのファイルはありません。
@end enumerate

例として、ここに@file{files.texi}のファイル属性を示します。

@example
@group
(file-attributes "files.texi")
     @result{}  (nil 
          1 
          2235 
          75 
          (8489 20284) 
          (8489 20284) 
          (8489 20285)
          14906 
          "-rw-rw-rw-" 
          nil 
          129500
          -32252)
@end group
@end example

@noindent
そして、この出力結果がどのように解釈されるかを以下に示します。

@table @code
@item nil
はディレクトリ、シンボリック・リンクのどちらでもないことを表しています。

@item 1
@c Overfull対策
@c (7.26811pt too wide)だけど、そんなに目立たないよ。無視、無視。
はただ一つの名前を(現在のデフォルト・ディレクトリに名前@file{files.texi}で)
もつことを表しています。

@item 2235
は@sc{uid} 2235のユーザが所有していることを表しています。

@item 75
は@sc{gid} 75のグループに属していることを表しています。

@item (8489 20284)
は最後にアクセスされた時間がAug 19 00:09であることを表しています。
不幸なことにEmacs内部では、この番号を時間を表わす文字列に変換できません。

@item (8489 20284)
は最終修正時間がAug 19 00:09であることを表しています。

@item (8489 20285)
はこのinodeを最後に変更したのはAug 19 00:09であることを表しています。

@item 14906
はこのファイルには14906文字を含んでいることを表しています。

@item "-rw-rw-rw-"
は所有者、グループ、他人に対する、読込み、書込みアクセスのモードを
表わしています。

@item nil
はファイルが再び作られる場合、同じ@sc{gid}を保持することを表わしています。

@item 129500
は129500というinode番号を表わしています。

@item -32252
は-32252というファイル・システムの番号です。

@end table
@end defun

@node Changing File Attributes
@section ファイルの名前と属性の変更
@cindex renaming files
@cindex copying files
@cindex deleting files
@cindex linking files
@cindex setting modes of files
@cindex ファイルの名前の変更[ふぁいるのなまえのへんこう]
@cindex ファイルのコピー[ふぁいるのこぴー]
@cindex ファイルの削除[ふぁいるのさくじょ]
@cindex ファイルのリンク[ふぁいるのりんく]
@cindex ファイルのモードの設定[ふぁいるのもーどのせってい]
@cindex 名前の変更、ファイルの[なまえのへんこう、ふぁいるの]
@cindex コピー、ファイルの[こぴー、ふぁいるの]
@cindex 削除、ファイルの[さくじょ、ふぁいるの]
@cindex リンク、ファイルの[りんく、ふぁいるの]
@cindex 設定、ファイルのモードの[せってい、ふぁいるのもーどの]

この節で説明する関数は、ファイルに対し、名前の変更、コピー、削除、
リンク、モードの設定を行ないます。

@var{newname}を引数としてもつ関数は、この名前をもつファイルが
すでに存在する場合に、引数@var{ok-if-already-exists}の値に
依存して、とられる動作が決まります。

@itemize @bullet
@item
@var{ok-if-already-exists}が@code{nil}の場合は、
@code{file-already-exists}エラーを発生します。

@item
@var{ok-if-already-exists}が数の場合は、確認を求めます。

@item
@var{ok-if-already-exists}がそのほかの任意の値の場合は、確認なしに、古い
ファイルを置き換えます。
@end itemize

@defun add-name-to-file oldname newname &optional ok-if-already-exists
@cindex file with multiple names
@cindex file hard link
@cindex 複数の名前をもつファイル[ふくすうのなまえをもつふぁいる]
@cindex ファイルのハード・リンク[ふぁいるのはーどりんく]
@cindex ファイル、複数の名前をもつ[ふぁいる、ふくすうのなまえをもつ]
@cindex ハード・リンク、ファイルの[はーどりんく、ふぁいるの]
この関数は、名前@var{oldname}をもつファイルに、追加の名前@var{newname}を
与えます。これは、@var{newname}が、@var{oldname}に対する新しい
``ハード・リンク''になることを意味します。

以下でまず最初に、二つのファイル@file{foo}と@file{foo3}のリストを例として
挙げます。

@example
@group
% ls -l fo*
-rw-rw-rw-  1 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3
@end group
@end example

ここで、形式@code{(add-name-to-file "~/lewis/foo" "~/lewis/foo2)}
を評価します。再びファイルのリストを示します。これにより@file{foo}と
@file{foo2}という二つの名前が表示されます。

@example
@group
@c この例のfoo1は間違いでは?
(add-name-to-file "~/lewis/foo" "~/lewis/foo2")
     @result{} nil
@end group

@group
% ls -l fo*
-rw-rw-rw-  2 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  2 rms       29 Aug 18 20:32 foo2
-rw-rw-rw-  1 rms       24 Aug 18 20:31 foo3
@end group
@end example

最後に、次の式を評価します。

@example
(add-name-to-file "~/lewis/foo" "~/lewis/foo3" t)
@end example

@noindent
そしてファイルのリストを再度挙げます。ここでは一つのファイルに対し、
三つの名前があります。すなわち、@file{foo}, @file{foo2}, @file{foo3}です。
古い@file{foo3}の内容は失われます。

@example
@group
(add-name-to-file "~/lewis/foo" "~/lewis/foo3")
     @result{} nil
@end group

@group
% ls -l fo*
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo2
-rw-rw-rw-  3 rms       29 Aug 18 20:32 foo3
@end group
@end example

この関数はVMSでは無意味です。VMSでは、一つのファイルが複数の名前を
もつことは許されません。

@ref{File Attributes}の@code{file-nlinks}も参照のこと。
@end defun

@deffn Command rename-file filename newname &optional ok-if-already-exists
このコマンドはファイル@var{filename}の名前を@var{newname}に変えます。

@var{filename}が@var{filename}以外の別名をもつ場合、このファイルは、
それらの名前を引き続き持ちます。事実、@code{add-name-to-file}を使って名前
@var{newname}を加え、@var{filename}を消去するというのは、一時的に中間的な
状態をもつことを除けば、名前替えと同じことをしていることになります。

この関数が対話的に呼ばれた場合には、ミニバッファに@var{filename}と
@var{newname}の入力を促します。また、@var{newname}がすでに存在した
場合には確認を求めます。
@end deffn

@deffn Command copy-file oldname newname &optional ok-if-already-exists time
このコマンドはファイル@var{oldname}を@var{newname}にコピーします。
@var{oldname}が存在しない場合には、エラーを発生します。

@var{time}が非@code{nil}の場合、この関数は、新しいファイルに対し、古い
ファイルが持っていたものと同じ最終修正時間を与えます
(これはいくつかのオペレーティングシステムでのみ機能します)。

この関数が対話的に呼び出された場合、ミニバッファに、@var{filename}と
@var{newname}の入力を促します。また、@var{newname}がすでに存在する
場合には、確認を求めます。
@end deffn

@deffn Command delete-file filename
@pindex rm
このコマンドは、シェル・コマンド@samp{rm @var{filename}}と同じように、
ファイル@var{filename}を削除します。そのファイルが複数の名前を持っている
場合、それはその別名で存在し続けます。

ファイルが存在しない、ないしは削除可能でない場合には、適切な種類の
@code{file-error}エラーを発生させます(UNIXの場合、ディレクトリが
書き込み可能であれば、ファイルは削除可能です)。

@ref{Create/Delete Dirs}の@code{delete-directory}も参照のこと。
@end deffn

@deffn Command make-symbolic-link filename newname  &optional
ok-if-already-exists
@pindex ln
@kindex file-already-exists
このコマンドは、@var{filename}に対し、名前@var{newname}のシンボリック・リンク
を作成します。これは、シェル・コマンド@samp{ln -s @var{filename} @var{newname}}
と同様です。

この関数は、対話的に呼び出された場合、ミニバッファで@var{filename}と
@var{newname}の入力を促します。また@var{newname}がすでに存在する場合には、
確認を求めます。
@end deffn

@defun define-logical-name varname string
この関数は、値@var{string}をもつような論理名@var{name}を定義します。
この関数はVMSでのみ利用可能です。
@end defun

@defun set-file-modes filename mode
この関数は@var{filename}のモード・ビットを@var{mode}に設定します
(これは整数でなければなりません)。 @var{mode}の下位12ビットのみが
使用されます。
@end defun

@c Emacs 19 の特徴
@defun set-default-file-modes mode
この関数は、Emacsおよびそのサブプロセスによって新規に作成されるファイルの、
デフォルトのファイル・プロテクションを設定します。
Emacsで作成されるファイルは、
すべて初期状態ではこのプロテクションを持ちます。
UNIXでは、デフォルト・プロテクションは、``umask''値のビットごとの補完値です。

引数@var{mode}は整数でなければなりません。@var{mode}の下位9ビットのみが
使用されます。

実在するファイルを修正して保存する場合は、ファイルを作成したこととは
解釈されません。この場合はファイルのモードは変化せず、デフォルトの
ファイル・プロテクションは使われません。
@end defun

@defun default-file-modes
この関数は現在のデフォルトのプロテクション値を返します。
@end defun

@cindex MS-DOS and file modes
@cindex file modes and MS-DOS
@cindex MS-DOSとファイル・モード[MS-DOSとふぁいるもーど]
@cindex ファイル・モードとMS-DOS[ふぁいるもーどとMS-DOS]
　MS-DOSでは、``実行可能''を表わすようなファイル・モード・ビットはありません。
よってEmacsは、ファイル名が@samp{.com}、@samp{.bat}、@samp{.exe}
で終わる場合に、実行可能であると解釈します。
これは、@code{file-mode}および@code{file-attributes}が返す値に反映されます。

@node File Names
@section ファイル名
@cindex file names
@cindex ファイル名[ふぁいるめい]

ファイルは、一般的には、Emacs内部ではどこでもその名前によって参照されます。
Emacsではファイル名は、文字列で表現されます。ファイルに対して機能する
ような関数はすべて、ファイル名を引数に取ることを期待します。

ファイル自身に作用するのに加え、Emacs Lispプログラムは、その名前自体に
作用する必要があるときがあります。つまり、もとのファイル名に関係するような
ファイル名を作成するために、名前を分割し、その名前の部分を使うためにです。
本節では、ファイル名をどのように操作するかについて説明します。

この節で説明する関数は、実際のファイルにはアクセスしないので、
実在しないファイルないしはディレクトリを示すようなファイル名
に対しても機能させることができます。

VMSでは、すべてのこれらの関数は、VMSファイル名構文とUNIX構文の両方を
理解します。これは、すべての標準Lispライブラリが、UNIX構文でファイル名を
指定しており、そのコードの変更なしに、VMSで適正に動作させるためです。
MS-DOSでは、これらの関数はUNIX構文と同様に、MS-DOSファイル名構文を理解します。

@menu
* File Name Components::  ファイル名のディレクトリ部分とその残り部分。
* Directory Names::       ディレクトリとしてのディレクトリの名前は、
                          ファイルとしての名前とは異なります。
* Relative File Names::   ファイル名には、現在のディレクトリからの
　　　　　　　　　　　　　相対的な名前である場合があります。
* File Name Expansion::   相対ファイル名から絶対ファイル名への変換。
* Unique File Names::     テンポラリ・ファイルの名前の生成。
* File Name Completion::  与えられたファイル名に対する補完候補の発見。
@end menu

@node File Name Components
@subsection ファイル名の構成要素
@cindex directory part (of file name)
@cindex nondirectory part (of file name)
@cindex version number (in file name)
@cindex ディレクトリ部分、ファイル名の[でぃれくとりぶぶん、ふぁいるめいの]
@cindex 非ディレクトリ部分、ファイル名の[ひでぃれくとりぶぶん、ふぁいるめいの]
@cindex バージョン番号、ファイル名中の[ばーじょんばんごう、ふぁいるめいちゅうの]

オペレーティングシステムは、ディレクトリに含まれるファイルをグループ化
します。あるファイルを指定するには、ディレクトリとそのディレクトリ内での
ファイル名を指定する必要があります。よってEmacsは、ファイル名を二つの主要な
部分をもつものとして解釈します。それは@dfn{ディレクトリ名(directory name)}
部分と、@dfn{非ディレクトリ(nondirectory)}部分
(すなわち
@dfn{そのディレクトリ内部でのファイル名(file name within the directory)})
です。どちらかの部分が空であるかもしれません。
これら二つの部分をつなげると、オリジナルのファイル名が再度作り出せます。

Unixでは、ディレクトリ部分とは、ファイル名の最初から最後のスラッシュ
までの部分です。非ディレクトリ部分はその残りの部分です。
VMSの構文でのこの規則は複雑です。

いくつかの目的のために、非ディレクトリ部分は、さらに厳密な意味での
名前と@dfn{バージョン番号(version number)}に分割されます。
Unixでは、バックアップ・ファイル
のみが名前の中にバージョン番号を持ちます。VMSでは、すべてのファイルが
バージョン番号を持ちますが、ファイル名がEmacsで実際に使われる時間の内の
ほとんどは、そのバージョン番号を省略します。
バージョン番号は、ほとんどの場合ディレクトリ・リストの中でみられます。

@defun file-name-directory filename
　この関数は、@var{filename}のディレクトリ部分を返します(あるいは
@var{filename}がディレクトリ部分をもたない場合には、@code{nil}を返します)。
Unixでは、この関数の返値は最後にスラッシュが付くような文字列です。
VMSでは、返値は、@samp{:}、@samp{]}、@samp{>}のいずれかの文字が最後に付く
ような文字列です。

@example
@group
(file-name-directory "lewis/foo")  ; @r{Unixの例}
     @result{} "lewis/"
@end group
@group
(file-name-directory "foo")        ; @r{Unixの例}
     @result{} nil
@end group
@group
(file-name-directory "[X]FOO.TMP") ; @r{VMSの例}
     @result{} "[X]"
@end group
@end example
@end defun

@defun file-name-nondirectory filename
　この関数は@var{filename}の非ディレクトリ部分を返します。

@example
@group
(file-name-nondirectory "lewis/foo")
     @result{} "foo"
@end group
@group
(file-name-nondirectory "foo")
     @result{} "foo"
@end group
@group
;; @r{以下は、VMSの場合の例です。}

(file-name-nondirectory "[X]FOO.TMP")
     @result{} "FOO.TMP"
@end group
@end example
@end defun

@defun file-name-sans-versions filename
　この関数は、@var{filename}からファイル・バージョン番号、バックアップ・
バージョン番号、および最後のチルダを除いたものを返します。

@example
@group
(file-name-sans-versions "~rms/foo.~1~")
     @result{} "~rms/foo"
@end group
@group
(file-name-sans-versions "~rms/foo~")
     @result{} "~rms/foo"
@end group
@group
(file-name-sans-versions "~rms/foo")
     @result{} "~rms/foo"
@end group
@group
;; @r{以下の例はVMSの場合のみ有効です。}

(file-name-sans-versions "foo;23")
     @result{} "foo"
@end group
@end example
@end defun

@defun file-name-sans-extension filename
この関数は、@var{filename}から(存在すれば)``拡張子''を除いたものを返します。
ファイル名中の拡張子とは、名前の最後の要素であり、最後の@samp{.}から
始まる部分です。例を示します。

@example
(file-name-sans-extension "foo.lose.c")
     @result{} "foo.lose"
(file-name-sans-extension "big.hack/foo")
     @result{} "big.hack/foo"
@end example
@end defun

@node Directory Names
@comment  node-name,  next,  previous,  up
@subsection ディレクトリ名
@cindex directory name
@cindex file name of directory
@cindex ディレクトリ名[でぃれくとりめい]
@cindex ディレクトリのファイル名[でぃれくとりのふぁいるめい]
@cindex ファイル名、ディレクトリの[ふぁいるめい、でぃれくとりの]

@dfn{ディレクトリ名(directory name)}は、ディレクトリの名前です。
ディレクトリはファイルの
一種であり、ファイル名を持ちディレクトリ名と関係がありますが、同一のも
のではありません(これは、通常のUnixでの用語法では、全く別のものです)。
同じ実体のものに対するこの二つの異なった名前は、構文的な変換によって
関連づけることができます。Unixでは、この変換は単純なものです。
ディレクトリ名はスラッシュで終わます。
一方のディレクトリのファイル名はそのスラッシュがありません。
VMSでは、この関係はより複雑です。

ディレクトリ名と、ディレクトリのファイル名の相違点は、微細な点ですが、
重要です。Emacs変数ないしは関数の引数が、ディレクトリ名として表わされて
いる場合には、ディレクトリのファイル名は許されません。

以下の二つの関数は、ディレクトリ名とファイル名の間で変換をします。
これらの関数は、@samp{$HOME}のような環境変数の置き換え、
@samp{~}、@samp{..}の展開、などの特別なことはしません。

@defun file-name-as-directory filename
この関数は、オペレーティングシステムがディレクトリの名前として
解釈できるような形式で、@var{filename}を表現する文字列を返します。
Unixでは、これはそのファイル名を表す文字列の最後にスラッシュを
つけ加えることを意味します。
VMSでは、この関数は、形式@file{[X]Y.DIR.1}の文字列を、形式@file{[X.Y]}
の文字列に変換します。

@example
@group
(file-name-as-directory "~rms/lewis")
     @result{} "~rms/lewis/"
@end group
@end example
@end defun

@defun directory-file-name dirname
この関数は、オペレーティングシステムがファイルの名前として解釈できる
ような形式で、@var{dirname}を表現する文字列を返します。
Unixでは、これはそのディレクトリを表す文字列から最後のスラッシュを
取り除くことを意味します。
VMSでは、この関数は、形式@file{[X.Y]}の文字列を、形式@file{[X]Y.DIR.1}
の文字列に変換します。

@example
@group
(directory-file-name "~lewis/")
     @result{} "~lewis"
@end group
@end example
@end defun

@cindex directory name abbreviation
@cindex ディレクトリ名の省略形[でぃれくとりめいのしょうりゃくけい]
@cindex 省略形、ディレクトリ名の[しょうりゃくけい、でぃれくとりめいの]
ディレクトリ名の省略形は、通常シンボリック・リンクを介してアクセスされるような
ディレクトリに対して有用です。
ユーザはまず最初に、リンク名をディレクトリの``名前''として認識し、
それからディレクトリの``本当の''名前をみつけるのにやっかいなのを
発見するのです。
リンク名を本物の名前に対する省略形として定義すれば、Emacsは代わりに、
この省略形をユーザにみせます。

@defvar directory-abbrev-alist
変数@code{directory-abbrev-alist}は、ファイル・ディレクトリを表わすために使う
省略形のalistを持ちます。おのおのの要素は、@code{(@var{from} . @var{to})}の
形式を持ち、ディレクトリ名に@var{from}が現われた場合、@var{to}に置き換える、
という意味を持ちます。
@var{from}文字列は、実際は正規表現です。これは、常に@samp{^}で始まるべきです。
関数@code{abbreviate-file-name}が、これらの置換を実行します。

あなたのサイトにあわせて省略形を設定する場合は、@file{site-init.el}で
この変数の設定ができます。

ここで例を示します。@file{/home/fsf}などのファイル・システムが、通常、
@file{/fsf}などのシンボリック・リンクからアクセスされるようなシステムの場合の
例です。

@example
(("^/home/fsf" . "/fsf")
 ("^/home/gp" . "/gp")
 ("^/home/gd" . "/gd"))
@end example
@end defvar

ディレクトリ名を省略形に変換する場合は、次の関数を使用してください。

@defun abbreviate-file-name dirname
この関数は、引数に@code{directory-abbrev-alist}の要素からの省略形を適用し、
ユーザのホーム・ディレクトリを@samp{~}に置換します。
@end defun

@node Relative File Names
@subsection 絶対ファイル名と相対ファイル名
@cindex absolute file name
@cindex relative file name
@cindex 絶対ファイル名[ぜったいふぁいるめい]
@cindex 相対ファイル名[そうたいふぁいるめい]
@cindex ファイル名、絶対[ふぁいるめい、ぜったい]
@cindex ファイル名、相対[ふぁいるめい、そうたい]

ファイル・システムの中にあるすべてのディレクトリは、ルート・ディレクトリ
からはじまる木構造を形成しています。あるファイル名というものは、この木の
ルートからはじまるディレクトリ名のすべてを指定できます。この場合、これは
@dfn{絶対(absolute)}ファイル名と呼ばれます。
あるいは、あるファイル名は、デフォルト・ディレクトリに対して相対的に、
その木の中でのファイルの位置を、指定できます。
これは@dfn{相対(relative)}ファイル名と呼ばれます。
Unixでは、絶対ファイル名はスラッシュないしはチルダ(@samp{~})で始まる名前で、
相対ファイル名はそうではありません。VMSでのこの規則は複雑です。

@defun file-name-absolute-p filename
この関数は、ファイル@var{filename}が絶対ファイル名である場合には@code{t}を
返し、そうでない場合には@code{nil}を返します。VMSでは、この関数はUnix構文と
VMS構文の両方を解釈します。

@example
@group
(file-name-absolute-p "~rms/foo")
     @result{} t
@end group
@group
(file-name-absolute-p "rms/foo")
     @result{} nil
@end group
@group
(file-name-absolute-p "/user/rms/foo")
     @result{} t
@end group
@end example
@end defun

@node File Name Expansion
@subsection ファイル名を展開する関数
@cindex expansion of file names
@cindex ファイル名の展開[ふぁいるめいのてんかい]
@cindex 展開、ファイル名の[てんかい、ふぁいるめいの]

ファイル名の@dfn{展開(expansion)}とは、
相対ファイル名を絶対ファイル名に変換することを意味します。
これはデフォルト・ディレクトリに対して相対的に変換されるので、
展開対象となるファイル名と同様、デフォルト・ディレクトリを指定しなければ
なりません。また展開は、@file{./}、@file{@var{name}/../}などの冗長なものを
ファイル名から取り除いて簡単にします。

@defun expand-file-name filename &optional directory
この関数は@var{filename}を絶対ファイル名に展開します。
@var{directory}が与えられた場合、@var{filename}が相対的表現であれば、
それは開始部分のディレクトリです
(@var{directory}の値は、それ自身は絶対ディレクトリ名でなければ
いけません。それは@samp{~}で始まるかもしれません)。
与えられない場合、カレント・バッファの
@code{default-directory}の値が使われます。
例を挙げます。

@example
@group
(expand-file-name "foo")
     @result{} "/xcssun/users/rms/lewis/foo"
@end group
@group
(expand-file-name "../foo")
     @result{} "/xcssun/users/rms/foo"
@end group
@group
(expand-file-name "foo" "/usr/spool/")
     @result{} "/usr/spool/foo"
@end group
@group
(expand-file-name "$HOME/foo")
     @result{} "/xcssun/users/rms/lewis/$HOME/foo"
@end group
@end example

@samp{.}あるいは@samp{..}を含むファイル名は、正準な形式に単純化されます。

@example
@group
(expand-file-name "bar/../foo")
     @result{} "/xcssun/users/rms/lewis/foo"
@end group
@end example

@samp{~/}はユーザのホーム・ディレクトリに展開されます。@samp{/}に続く
@samp{/}ないしは@samp{~}に対しては、そこから絶対ファイル名が開始されると
解釈され、そこに先立つ部分を無視します。
よってこの@samp{/}ないしは@samp{~}の前にあるものはすべて取り除かれます。
例を挙げます。

@example
@group
(expand-file-name 
 "/a1/gnu//usr/local/lib/emacs/etc/MACHINES")
     @result{} "/usr/local/lib/emacs/etc/MACHINES"
@end group
@group
(expand-file-name "/a1/gnu/~/foo")
     @result{} "/xcssun/users/rms/foo"
@end group
@end example

@noindent 
この両方の場合で@file{/a1/gnu/}は、絶対ファイル名がそれに続くことに
より捨てられます。

@code{expand-file-name}は、環境変数は展開@emph{しない}ことに
注意してください。これをするのは@code{substitute-in-file-name}だけです。
@end defun

@c Emacs 19 の特徴
@defun file-relative-name filename directory
この関数は、展開の逆のことをします。ファイル名が@var{directory}に対して
相対的に解釈されたとき、@var{filename}と等価な相対ファイル名を返そう
とします(もしそのような相対ファイル名が絶対ファイル名より長ければ、
この関数は代わりに絶対名を返します)。

@example
(file-relative-name "/foo/bar" "/foo/")
     @result{} "bar")
(file-relative-name "/foo/bar" "/hack/")
     @result{} "/foo/bar")
@end example
@end defun

@defvar default-directory
このバッファローカルな変数の値は、
カレント・バッファのデフォルト・ディレクトリです。
これは絶対ディレクトリ名であるべきです。これは@samp{~}で始まっているかも
しれません。この変数は、すべてのバッファでローカルな変数です。

@code{expand-file-name}は、
2番目の引数が@code{nil}のとき、このデフォルト・ディレクトリを使います。

Unixシステムでは、この値は、つねにスラッシュで終わる文字列です。

@example
@group
default-directory
     @result{} "/user/lewis/manual/"
@end group
@end example
@end defvar

@defun substitute-in-file-name filename
この関数は@var{filename}中で参照される環境変数を、環境変数の値で置換します。
標準のUnixのシェル構文では、@samp{$}は環境変数の値を置き換えるための
接頭辞です。

環境変数の名前は、@samp{$}に続く、英数字(_を含む)の列です。
@samp{$}に続く文字が@samp{@{}である場合、それに対応する@samp{@}}までの
すべてが変数名です。

@c Wordy to avoid overfull hbox.  --rjc 15mar92

ここで、ユーザのホーム・ディレクトリを表わす環境変数@code{HOME}が、
@c Overfull対策
@iftex
値@samp{/xcssun/@linebreak{}users/rms}をもつものとします。
@end iftex
@ifinfo
値@samp{/xcssun/users/rms}をもつものとします。
@end ifinfo

@example
@group
(substitute-in-file-name "$HOME/foo")
     @result{} "/xcssun/users/rms/foo"
@end group
@end example

置換後の表現で、@samp{/}の後に@samp{~}ないしは@samp{/}が現われる場合は、
前の@samp{/}より前のものはすべて捨てられます。

@example
@group
(substitute-in-file-name "bar/~/foo")
     @result{} "~/foo"
@end group
@group
(substitute-in-file-name "/usr/local/$HOME/foo")
     @result{} "/xcssun/users/rms/foo"
@end group
@end example

VMSでは、@samp{$}についての置換はされません。よってVMSでは、この関数は、
上に示したような不必要な最初の要素の除去以外の操作は、なにもしません。
@end defun

@node Unique File Names
@subsection 唯一存在するファイル名を生成する

プログラムでは、一時的なファイルを作成する必要がある場合があります。
ここでは、そのようなファイルの名前をつくるために通常使われる手法を
説明します。

@example
(make-temp-name (concat "/tmp/" @var{name-of-application}))
@end example

@noindent
ここではディレクトリは@file{/tmp/}を使用します。というのは、これはUnixでは、
一時ファイルを作成するのには標準の場所だからです。
@code{make-temp-name}の仕事は、二人の異なるユーザ、ないしは二つの異なる
ジョブが、同じファイル名を使うのを回避することです。

@defun make-temp-name string
この関数は唯一の名前として使うことができる文字列を生成します。
その名前は@var{string}で始まり、それぞれのEmacsジョブで異なるような数値で
終わります。

@example
@group
(make-temp-name "/tmp/foo")
     @result{} "/tmp/foo021304"
@end group
@end example

同一のEmacs上で動作する別のライブラリの間で、ファイル名が衝突するのを
避けるために、@code{make-temp-name}を使うEmacs lispプログラムは、すべて自身
の@var{string}をもつべきです。名前の最後に加えられる数字は、別のEmacsの
ジョブで動作する同一のアプリケーションを区別します。
@end defun

@node File Name Completion
@subsection ファイル名補完
@cindex file name completion subroutines
@cindex completion, file name
@cindex ファイル名補完サブルーチン[ふぁいるめいほかんさぶるーちん]
@cindex 補完、ファイル名[ほかん、ふぁいるめい]

この節ではファイル名を補完するための低レベルのサブルーチンについて
説明します。ほかの補完関数は、@ref{Completion}を参照のこと。

@defun file-name-all-completions partial-filename directory
この関数は、ディレクトリ@var{directory}にあり、@var{partial-filename}で
始まるファイル名をもつファイル名について、すべての補完候補ファイル名のリスト
を返します。補完リスト中の要素の順序というものは、そのディレクトリにある
ファイルの順序であり、これは、前もって予期できるものでもありませんし、
有益な情報を提供するわけでもありません。

引数@var{partial-filename}は、ディレクトリ部分もスラッシュも含まないような
ファイル名でなければいけません。もし@var{directory}が絶対表記でなければ、
カレント・バッファのデフォルト・ディレクトリがそれに先立ちます。

@c 訳注:実はprependという動詞が辞書に載ってないのですが。

以下の例では、現在のデフォルト・ディレクトリ@file{~rms/lewis}に、
@samp{f}で始まる名前のファイルが五つあるものとしています。
@file{foo}、 @file{file~}、 @file{file.c}、 @file{file.c.~1~}、
@file{file.c.~2~}です。@refill

@example
@group
(file-name-all-completions "f" "")
     @result{} ("foo" "file~" "file.c.~2~" 
                "file.c.~1~" "file.c")
@end group

@group
(file-name-all-completions "fo" "")  
     @result{} ("foo")
@end group
@end example
@end defun

@defun file-name-completion filename directory
この関数はディレクトリ@var{directory}にあるファイル名@var{filename}に対し、
補完を行ないます。ディレクトリ@var{directory}中の、@var{filename}で始まる
すべてのファイルに対し、共通な最も長い接頭辞を返します。

一致するものがただ一つで、@var{filename}に完全に一致する場合、
この関数は@code{t}を返します。ディレクトリ@var{directory}中に
@var{filename}で始まるファイルがない場合には@code{nil}を返します。

以下の例で、現在のデフォルト・ディレクトリに、@samp{f}で始まる五つのファイル
があるとします。そのファイルは@file{foo}、 @file{file~}、 @file{file.c}、
@file{file.c.~1~}、 @file{file.c.~2~}です。@refill

@example
@group
(file-name-completion "fi" "")
     @result{} "file"
@end group

@group
(file-name-completion "file.c.~1" "")
     @result{} "file.c.~1~"
@end group

@group
(file-name-completion "file.c.~1~" "")
     @result{} t
@end group

@group
(file-name-completion "file.c.~3" "")
     @result{} nil
@end group
@end example
@end defun

@defopt completion-ignored-extensions
@code{file-name-completion}は、通常このリストにある文字列で終わるような
ファイル名はすべて無視します。
可能な補完候補の最後の部分が、すべてこれらの接尾辞のどれかである場合、
または、すべての補完候補を示すためのバッファが表示される場合は、
無視しません。@refill

典型的な値はこのようなものかもしれません。

@example
@group
completion-ignored-extensions
     @result{} (".o" ".elc" "~" ".dvi")
@end group
@end example
@end defopt

@node Contents of Directories
@section ディレクトリの内容
@cindex directory-oriented functions
@cindex file names in directory
@cindex ディレクトリに関係する関数[でぃれくとりにかんけいするかんすう]
@cindex ファイル名、ディレクトリ中の[ふぁいるめい、でぃれくとりちゅうの]

ディレクトリは一種のファイルで、さまざまな名前を持ったほかのファイルを
含んでいます。ディレクトリは、ファイル・システムを特徴づけるものの一つです。

Emacsは、ディレクトリ中のファイルの名前を、Lispのリストとしてリスト
アップすることができます。あるいは、@code{ls}シェル・コマンドを使用して、
バッファにその名前を表示することができます。
後者の場合では、@code{ls}コマンドに渡すオプションに応じて、
それぞれのファイルについての情報を選択的に表示することができます。

@defun directory-files directory &optional full-name match-regexp nosort
この関数は、ディレクトリ@var{directory}にあるファイル名のリストを返します。
デフォルトでは、リストはアルファベット順で並べられます。

@var{full-name}が非@code{nil}の場合、この関数はファイルの絶対ファイル名
を返します。そうでない場合、指定のディレクトリに対する相対名を返します。

@var{match-regexp}が非@code{nil}の場合、この関数は、その正規表現に
一致する部分を含むようなファイル名のみを返します。それ以外のファイル名はリスト
から外します。

@c Emacs 19 の特徴
@var{nosort}が非@code{nil}の場合、@code{directory-files}は
リストをソートしませんので、特定の順序をつけずにファイル名を返します。
可能なかぎりの最大の処理速度が必要で、ファイルの処理順序が関係ない場合に、
これを使用してください。
ファイル処理の順序がユーザから分かってしまう場合は、あなたがそのファイル
の名前をソートしてやれば、ユーザにとってはおそらく便利でしょう。

@example
@group
(directory-files "~lewis")
     @result{} ("#foo#" "#foo.el#" "." ".."
         "dired-mods.el" "files.texi" 
         "files.texi.~1~")
@end group
@end example

@var{directory}が、読み出すことのできるディレクトリの名前でない場合には、
エラーを発生します。
@end defun

@defun file-name-all-versions file dirname
この関数は、ディレクトリ@var{dirname}にある、@var{file}という名前の
ファイルのすべてのバージョンのリストを返します。
@end defun

@defun insert-directory file switches &optional wildcard full-directory-p
この関数は、ディレクトリ@var{file}中のファイル・リストを(カレント・バッファに)
挿入します。これは、@var{switches}つきの@code{ls}でフォーマットした
ものです。この関数により、ポイントは挿入されたテキストの後に移動します。

引数@var{file}は、ディレクトリ名か、ワイルドカードを含むような
ファイル仕様であるかもしれません。@var{wildcard}が非@code{nil}の場合、
これは、@var{file}をワイルドカードを含むファイル仕様として取り扱う
ことを意味します。

@var{full-directory-p}が非@code{nil}の場合、これは@var{file}がディレクトリで、
スイッチが@samp{-d}を含まないということを意味します。そしてこの場合の
リストは、ディレクトリ中のすべての内容を表示すべきです
(@code{ls}の@samp{-d}オプションは、ディレクトリの内容ではなく、
ディレクトリ自身の情報を表示することを意味します)。

この関数は、ディレクトリのリストを作るために、
変数@code{insert-directory-program}で示される名前のプログラムを起動します。
また@var{wildcard}が非@code{nil}の場合、ワイルドカードを展開するために、
@code{shell-file-name}で指定されるシェルもまた同様に起動します。
@end defun

@defvar insert-directory-program
この変数の値は、関数@code{insert-directory}が、あるディレクトリ中の
ファイルのリストをつくるために起動するプログラムです。
@end defvar

@node Create/Delete Dirs
@section ディレクトリの作成と削除
@c Emacs 19 の特徴

Emacs Lispでのたいていのファイル操作関数は、それがディレクトリであるような
ファイルに対して使われた場合は、エラーとなります。
たとえば、@code{delete-file}を使って、ディレクトリを削除することはできません。
ここで説明する特別な関数は、このディレクトリを作成したり削除するために
あります。

@defun make-directory dirname
この関数は@var{dirname}という名前のディレクトリを作成します。
@end defun

@defun delete-directory dirname
この関数は、@var{dirname}という名前のディレクトリを削除します。
関数@code{delete-file}は、ディレクトリであるようなファイルには機能しません。
この場合には、@code{delete-directory}を使わなければいけません。 
そのディレクトリがなんらかのファイルを含んでいる場合には、
@code{delete-directory}はエラーを発生します。
@end defun

@node Magic File Names
@section ファイル名を``魔力のあるもの''にする
@cindex magic file names
@cindex 魔法ファイル名[まほうふぁいるめい]

@c Emacs 19の特徴
　あるファイル名に対し、特別な扱いをさせることができます。
これは、これらのファイル名を@dfn{魔力のあるもの(magic)}にする、と言います。
これには、名前のクラスを定義する正規表現
(このクラスのメンバはその正規表現に一致するようなものすべてです)と、
この一致するファイル名に対して機能するハンドラ、
すなわちすべてのプリミティブなEmacsファイル操作を実装する
ハンドラ、を与えてやらなければなりません。

変数@code{file-name-handler-alist}はハンドラのリストで、それぞれの
ハンドラがいつ適用されるかを決定する正規表現をともに持ちます。
各要素は次の形式です。

@example
(@var{regexp} . @var{handler})
@end example

@noindent
ファイル・アクセスとファイル名変換を行なうすべてのEmacsプリミティブは、
引数として与えられたファイル名を、@code{file-name-handler-alist}に
照らし合します。ファイル名が@var{regexp}に一致する場合、
そのプリミティブは、@var{handler}を呼び出してそのファイルをハンドルします。

@var{handler}には、そのプリミティブの名前が第一の引数として与えられます。
残りの引数は、そのファイル操作に与えられた引数がそのまま渡されます
(典型的には、この残りの引数の一番最初のものはファイル名そのものです)。
たとえば、

@example
(file-exists-p @var{filename})
@end example

@noindent 
の場合で、@var{filename}がハンドラ@var{handler}をもつ時、
@var{handler}はこのように呼び出されます。

@example
(funcall @var{handler} 'file-exists-p @var{filename})
@end example

ここに、魔法ファイル名のハンドラがハンドルする権利を得る操作を示します。

@noindent
@code{add-name-to-file}, @code{copy-file}, @code{delete-directory},
@c Overfull対策
@c オリジナルのOverfull対策の@*を削除
@c 一応@ifinfoで残しておいたけど、いらないんじゃないかな?
@c file-directory-pのところは、(1.42836pt too wide)だから無視。
@iftex
@code{delete-file},
@end iftex
@ifinfo
@code{delete-file},@*
@end ifinfo
@code{diff-latest-backup-file},
@code{directory-file-name},
@code{directory-files},
@code{dired-compress-file}, @code{dired-uncache},
@c Overfull対策
@c ここも一緒
@iftex
@code{expand-file-name},
@end iftex
@ifinfo
@code{expand-file-name},@*
@end ifinfo
@code{file-accessible-directory-p},
@code{file-attributes}, @code{file-directory-p},
@code{file-executable-p}, @code{file-exists-p}, @code{file-local-copy},
@code{file-modes}, @code{file-name-all-completions},
@code{file-name-as-directory}, @code{file-name-completion},
@code{file-name-directory}, @code{file-name-nondirectory},
@code{file-name-sans-versions}, @code{file-newer-than-file-p},
@code{file-readable-p}, @code{file-regular-p}, @code{file-symlink-p},
@code{file-truename}, @code{file-writable-p},
@code{get-file-buffer},
@code{insert-directory},
@code{insert-file-contents}, @code{load}, @code{make-directory},
@code{make-symbolic-link}, @code{rename-file}, @code{set-file-modes},
@code{set-visited-file-modtime}, @code{unhandled-file-name-directory},
@code{verify-visited-file-modtime}, @code{write-region}.

@code{insert-file-contents}に対するハンドラでは、
その関数の@var{visit}引数が非@code{nil}の場合では、
典型的な処理として、
@code{(set-buffer-modified-p nil)}で、
そのバッファの修正のフラグをクリアしてやる必要があります。
またこれは、バッファがロックされている場合には、それをアンロックするという
効果があります。

ハンドラ関数は上の操作のすべてと、おそらく将来加わるほかの操作
とをハンドルしなければいけません。
これらのすべての操作を実装する必要はありません。
ハンドラ関数は、ある操作に対して特別にすべきことがないときは、
プリミティブを再起動してやれば、その操作を``通常のやり方''でハンドル
することができます。
ハンドラ関数が関係しないような操作のプリミティブは、つねに再起動すべきです。
以下にこれを行う方法の例を示します。

@smallexample
(defun my-file-handler (operation &rest args)
  ;; @r{最初に、特別な扱いが必要な演算についてチェックする}
  (cond ((eq operation 'insert-file-contents) @dots{})
        ((eq operation 'write-region) @dots{})
        @dots{}
        ;; @r{知らない操作に対するハンドル}
        (t (let ((inhibit-file-name-handlers
                 (cons 'my-file-handler 
                       (and (eq inhibit-file-name-operation operation)
                            inhibit-file-name-handlers)))
                (inhibit-file-name-operation operation))
             (apply operation args)))))
@end smallexample

ハンドラ関数が、その中でその通常のEmacsプリミティブを呼び出す時には、
そのプリミティブが同じハンドラから再度呼ばれないようする必要があります。
そうでなければ無限の再帰が生じてしまいます。
上の例では、変数@code{inhibit-file-name-handlers}と
@code{inhibit-file-name-operation}を使って、これをどうやるかを示しています。
これらの変数は上で示したように注意して正確に使ってください。
複数のハンドラをもつ場合に適切な振る舞いをさせる場合と、
二つのファイル名をもち、そのそれぞれがハンドラをもつような操作の場合に、
この例のような詳細な部分が重要になります。

@defvar inhibit-file-name-handlers
この変数は、ある操作に対して現在使用を禁止されているハンドラのリストを
持ちます。
@end defvar

@defvar inhibit-file-name-operation
現在、ハンドラの使用禁止の対象となっている操作。
@end defvar

@defun find-file-name-handler file operation
この関数は、ファイル名@var{file}に対するハンドラ関数を返します。もしハンドラ
がなければ@code{nil}を返します。引数@var{operation}は、ファイルに対して機能
する操作でなければいけません。@var{operation}は、その操作が呼ばれたときに、
その最初の引数としてハンドラに渡される値です。この操作を表わす引数は、
@code{inhibit-file-name-operation}との比較を行なうために必要です。
@end defun

@defun file-local-copy filename
この関数は、ファイル@var{filename}がすでに魔法ファイルであれば、
これを通常の非魔法ファイルにコピーします。

@var{filename}が、Emacsの外のプログラムからは直接は読み書きできない
ような``魔法''ファイル名を指している場合、この関数は、通常のファイルに
内容をコピーし、そのファイル名を返します。

@var{filename}が通常のファイル名で魔法ファイル名でない場合、この関数は
なにもせず@code{nil}を返します。
@end defun

@defun unhandled-file-name-directory filename
この関数は、魔力を持たないディレクトリの名前を返します。
ファイル@var{filename}が魔力を持たない場合、
この関数は@var{filename}のディレクトリ部分を返します。
そうでなければハンドラに対して何をすべきかを尋ねます。

これは、サブプロセスを起動する場合に便利です。すべてのサブプロセスは
カレント・ディレクトリとして魔力を持たないディレクトリを持たなければなりません。
この関数を使うのは、この要求にあったよい方法です。
@end defun

@node Format Conversion
@section ファイル・フォーマットの変換
@cindex file format conversion
@cindex encoding file formats
@cindex decoding file formats
@cindex ファイル・フォーマットの変換[ふぁいるふぉーまっとのへんかん]
@cindex ファイル・フォーマットの符号化[ふぁいるふぉーまっとのふごうか]
@cindex ファイル・フォーマットの復号化[ふぁいるふぉーまっとのふくごうか]
@cindex 符号化、ファイル・フォーマットの[ふごうか、ふぁいるふぉーまっとの]
@cindex 復号化、ファイル・フォーマットの[ふくごうか、ふぁいるふぉーまっとの]

変数@code{format-alist}は、@dfn{ファイル・フォーマット(file formats)}
のリストを定義します。
これは、Emacsバッファ中のデータ(テキストやテキスト属性、場合によると
ほかの情報も)がファイルとなるときに、テキスト的にどのような表現になるかを
記述したものです。
Emacsは、ファイルを読んだり書いたりするときに、適切ならばフォーマット
変換をします。

@defvar format-alist
このリストの要素は、定義されたファイル・フォーマットごとに、一つのフォーマット
定義を持ちます。
@end defvar

@cindex format definition
@cindex フォーマット定義[ふおーまっとていぎ]
フォーマット定義は、このような形式のリストです。

@example

(@var{name} @var{doc-string} @var{regexp} @var{from-fn} @var{to-fn}
@var{modify} @var{mode-fn})

@end example

フォーマット定義の各要素の意味は次のようになります。

@table @var
@item name
このフォーマットの名前です。


@item doc-string
このフォーマットを説明した文字列です。

@item regexp
このフォーマットで表現されたファイルを識別するために使う正規表現です。

@item from-fn
(ファイル・データを、通常のEmacsでのデータの表現に変換するために)
データをこのフォーマットで復号化するために呼びだされる関数です。

@var{from-fn}は、二つの引数@var{begin}と@var{end}をともなって呼び出されます。
これらはバッファの変換すべき部分を指定します。
この関数は、そのテキストを適切に編集することにより、変換を行うべきです。
これによって、テキストの長さが変わるので、@var{from-fn}は修正後のバッファの
最後の位置を返すべきです。

@var{from-fn}は、ファイルの頭が@var{regexp}に一致しないようにしてやらなけれ
ばなりません。そうでなければ、またフォーマット変換が行なわれてしまいます。

@item to-fn
(通常のEmacsでのデータの表現をこのフォーマットに変換するために)
データをこのフォーマットで符号化するために呼び出される関数です。

@var{to-fn}は、二つの引数@var{begin}と@var{end}をともなって呼び出されます。
これらはバッファの変換すべき部分を指定します。
この関数がフォーマット変換をする方法は、二つあります。

@itemize @bullet

@item
バッファを適切に編集する方法。この場合、@var{to-fn}は、テキストを
修正した部分の最後の位置を返すべきです。

@item
注釈のリストを返す方法。これは、各要素が形式
@code{(@var{position} . @var{string})}であるようなリストです。
ここで、@var{position}は、書き込まれるテキストとしての中での相対的な位置を
指定する整数です。また、@var{string}は、その位置に書き加えられる注釈
です。このリストは、@var{to-fn}がそれを返すときには、位置の順序で
ソートされていなければなりません。

@code{write-region}が実際にテキストをバッファからファイルに書き込む時、
この関数は、指定された注釈を対応する位置に入れ込みます。
これらをすべて、そのバッファを修正せずに行ないます。
@end itemize

@item modify
フラグです。符号化関数によりバッファを修正する場合には@code{t}を、
注釈のリストを返す場合は@code{nil}をいれてください。


@item mode
visitしてファイルをこのフォーマットから変換した後に
呼び出すモード関数です。
@end table

関数@code{insert-file-contents}は、その指定したファイルを読み込んだときに、
自動的にファイル・フォーマットを識別します。
この関数は、そのファイルの始めの部分のテキストをフォーマット定義の
正規表現と比較します。このときに一致部分があった場合には、そのフォーマットの
復号化関数を呼び出します。そして再びすべてのフォーマットをチェックします。
この関数は、ファイル・フォーマットが適用できなくなるまでこれを繰り返します。

@code{find-file-noselect}あるいはこれを呼び出すコマンド
を使ってファイルをvisitするときは、同じように変換を実行します
(というのはこの関数は@code{insert-file-contents}を呼び出すからです)。
またこの関数は、それが復号化したフォーマットに対応するモード関数を
呼び出します。この関数は、バッファローカルな変数@code{buffer-file-format}
に、フォーマット名のリストを記録します。

@defvar buffer-file-format
この変数は、visitされているファイルのフォーマットを表わしています。
つまりこれは、カレント・バッファにファイルをvisitしたときに、復号化を行なった
ファイル・フォーマット名のリストです。
この関数は、すべてのバッファでつねにローカルです。
@end defvar

@code{write-region}を使ってデータをファイルに書き込むとき、
この関数はまず最初に、@code{buffer-file-format}のフォーマット
に対する符号化関数を、そのリスト中の順で呼び出します。

@defun format-write-file file format
このコマンドは、カレント・バッファの内容をフォーマット@var{format}で
ファイル@var{file}に書き込みます。そして、このバッファが後に保存される
場合に使うために、そのフォーマットがデフォルトであるとします。
引数@var{format}は、フォーマット名のリストです。
@end defun

@defun format-find-file file format
このコマンドは、@var{file}をvisitしますが、そのときにフォーマット
@var{format}にしたがってそのファイルを変換します。
またこのコマンドは、そのバッファが後に保存される場合のために、
@var{format}をそのバッファに対するデフォルトのフォーマットにします。

引数@var{format}はフォーマット名のリストです。@var{format}が@code{nil}
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
@var{format}に対しては単に@key{RET}を入力すれば、
値@code{nil}が割り当てられます。
@end defun

@defun format-insert-file file format &optional beg end
このコマンドは、ファイル@var{file}の内容を現在のバッファに
挿入しますが、そのときにフォーマット@var{format}にしたがって変換を行ないます。
@var{beg}と@var{end}が非@code{nil}の場合には、これはそのファイルの
読み込まれる部分を指定することになります。これは@code{insert-file-contents}
と同様です(@pxref{Reading from Files})。

返値は@code{insert-file-contents}と同様です。すなわち、その絶対ファイル名
と(変換後の)挿入されたデータ長のリストを返します。

引数@var{format}はフォーマット名のリストです。@var{format}が@code{nil}
の場合には、変換はされません。このコマンドが対話的に呼ばれた場合には、
@var{format}に対しては単に@key{RET}を入力すれば、
値@code{nil}が割り当てられます。
@end defun

@defvar auto-save-file-format
この変数は、自動セーブのときに使うフォーマットを指定します。
この値は、@code{buffer-file-format}と同様、フォーマット名のリストですが、
自動セーブ・ファイルの書き込み時には、@code{buffer-file-format}の
代わりに使われるリストです。
この変数は、すべてのバッファでつねにローカルです。
@end defvar

@node Files and MS-DOS
@section ファイルとMSDOS
@cindex MS-DOS file types
@cindex file types on MS-DOS
@cindex text files and binary files
@cindex binary files and text files
@cindex MS-DOSのファイル・タイプ[MS-DOSのふぁいるたいぷ]
@cindex ファイル・タイプ、MS-DOSでの[ふぁいるたいぷ、MS-DOSでの]
@cindex テキスト・ファイルとバイナリ・ファイル[てきすとふぁいるとばいなりふぁいる]
@cindex バイナリ・ファイルとテキスト・ファイル[ばいなりふぁいるとてきすとふぁいる]

MS-DOS上のEmacsは、テキストとバイナリ・ファイルを区別して扱います。MS-DOS上
での通常のテキストは、行間で二つの文字シーケンス、
キャリッジ・リターンとラインフィード
(@sc{crlf})を使用するため、この区別は必要です。Emacsは、行間に一つの改行文字
(一つのラインフィード)があることだけを期待しています。Emacsが、MS-DOS上で
テキスト・ファイルを読む、ないしは書くとき、行のセパレータを変換する
必要があります。
これはEmacsが、どのファイルがテキストで、どのファイルがバイナリかを知る必要
があるということを意味しています。
Emacsは、このバイナリ・ファイルかテキスト・ファイルかという決定を
ファイルをvisitしたときに行ない、その決定結果をそのファイルを保存するときに
使うために、変数@code{buffer-file-type}に記録します。

サブプロセスについて関係する特徴については、@xref{MS-DOS Subprocesses}。

@defvar buffer-file-type
この変数は、自動的にそれぞれのバッファにローカルで、バッファがvisitする
ファイルのファイル・タイプを記録します。値は、テキストの場合は@code{nil}
であり、バイナリの場合は@code{t}です。
@end defvar

@defun find-buffer-file-type filename
この関数は、ファイル@var{filename}がテキスト・ファイルであるかバイナリ
ファイルであるかを決定します。テキスト・ファイルの場合は@code{nil}を返し、
バイナリ・ファイルの場合は@code{t}を返します。
@end defun

@defopt file-name-buffer-file-type-alist
この変数は、テキスト・ファイルとバイナリ・ファイルを区別するために使うalist
を持ちます。
リストの要素はそれぞれ(@var{regexp} . @var{type})という形式を持ちます。
@var{regexp}は、ファイル名と照合します。
@var{type}は、@code{nil}の場合はテキストを、
@code{t}の場合はバイナリを意味します。
あるいは@var{type}は、そのどちらかであるかを判断するための関数が格納されます。
@var{type}が関数の場合は、一つの引数(ファイル名)を
取って呼び出されて、@code{t}か@code{nil}を返すべきです。
@end defopt

@defopt default-buffer-file-type
この変数は、名前からは特に判断がつかないようなファイルに対して
デフォルトのタイプを指定します。この値は、テキストの場合には@code{nil}、
バイナリの場合には@code{t}であるべきです。
@end defopt

@deffn Command find-file-text filename
@code{find-file}と同様の機能を持ちますが、そのファイルを名前と無関係に、
テキスト・ファイルとして取り扱います。
@end deffn

@deffn Command find-file-binary filename
@code{find-file}と同様の機能を持ちますが、そのファイルを名前と無関係に、
バイナリ・ファイルとして取り扱います。
@end deffn
