C言語に存在する、remove()とunlink()の違い。
別に『ファイルを削除する』という目的が正常に行われれば手段は問わないし理由なんかどうでもいい、ということであれば、たぶんここに書いていることもどうでもいいと思います。プロジェクトメンバーにこの質問を投げかけたら、そんなことどうでもいい、と軽くあしらわれましたし。
でも、結果が同じ『ファイルを削除する』だけの処理で、なんで2種類の方法が存在しているのか、気になりません?自分は気になりました。
気になったら検索
さっそくUNIXにログインし、manページを表示してみる。コマンドはそれぞれ以下の通り。
% man remove
% man unlink
どちらも英語びっしりで表示されて、よくわかりませんでした(笑)
英語がわからなければ意味もわからないので、ネット上にmanページを日本語に翻訳してくれている神のようなサイト「JM Project」で検索しなおしてみる。
または、グーグル先生に「Manpage remove」「Manpage unlink」というキーワードで聞いてみてもいいと思います。JM Projectのページが検索結果に出てきます。
それぞれには微妙が違いがあった
マニュアルページによると、remove()は、ファイルを指定された場合は内部でunlink()を呼び、ディレクトリを指定された場合はrmdir()を呼ぶらしい。つまり、削除対象がファイルなのかディレクトリなのかを問わない場合は、remove()だけで処理が完結できる。
unlink()は、正確にはファイルを削除するコマンドではなくて、名前を削除するコマンド。ただ、指定した名前がファイルを参照している場合に限り、ファイル削除も行われる。この場合の名前というのは、ファイル名だったりシンボリックリンク名だったりソケット名だったりデバイス名だったり。
ファイル削除を目的としてunlink()を使う場合は、ディレクトリが指定されたら削除したくない、明示的にファイルだけを削除対象にしたい、という条件のもと、remove()より安全かもしれない。unlink()でディレクトリを削除しようとすればエラーとしてEISDIRが返るようだし。
とは言え、本来は削除処理を行う前に、ディレクトリなのかファイルなのかを事前チェックするべきだけど。
さいごに
同じことで、remove()とrmdir()の関係性にも言える。ディレクトリだけを明示的に削除するならrmdir()だし、ファイルなのかディレクトリなのかを問わない場合はremove()でよい、と。
間違いやバグの原因を作らない、ということであれば、remove()は使わずに、unlink()とrmdir()を使い分けた方がいい、とも言えますね。remove()は「便利関数」と言ったところかな。
それぞれのmanページ(日本語)は、以下のリンクからどうぞ。
コメント