ファイルの削除と名前の変更

こんにちは、めのんです!

ここのところ何回か続けてファイル関係の話題を取り上げてきました。
これまで全部ファイルというよりはストリームに関する内容でしたので、今回はファイルそのものの扱いについて解説したいと思います。
タイトルの通り、ファイルの削除と名前の変更についてです。

こういう操作はファイルシステムに依存するところが大きいんですけど、Cの標準規格でも最低限のことはサポートしています。
それが削除と名前の変更になります。

ファイル名の指定方法

ファイルの削除や名前の変更を行う際にはファイル名を関数に渡すことになります。
このファイル名の指定の仕方なんですが、Cの規格ではほとんど何も決まっていません。

実践的なプログラムを開発する際には、せめて相対パスで指定するのか絶対パスで指定するのかぐらいはハッキリさせて欲しいところですよね。

規格上は何も決まっていませんが、汎用のOSの上で動作するプログラムであれば、カレントディレクトリからの相対パスでも絶対パスでもいいはずです。
もちろん、ディレクトリの区切り文字やドライブなどのプラットフォーム依存の表現については配慮する必要があります。

ファイル名やディレクトリ名の大文字小文字の区別もそうですし、有意文字列が先頭何文字かというのもプラットフォームに依存することでしょう。

ファイルの削除

ファイルの削除には「remove関数」を使用します。
PHPにはunlink関数がありますが、それと大体同じだと考えてよいと思います。
ただし、返却値は成功したときにゼロを返すので要注意です。

remove関数は「stdio.h」ヘッダで次のように宣言されています。

int remove(const char *filename)

remove関数は引数filenameで指定したファイルを削除します。
指定したファイルがオープンされているときの動作は処理系定義です。

この関数は成功したときはゼロを返します。
失敗したときにはゼロ以外の値を返します。

ファイル名の変更

ファイル名の変更には「rename関数」を使います。
PHPにも同名の関数がありますが、ほぼ同じだと思ってかまいません。
ただし、remove関数同様、成功したときがゼロになります。
また、PHPのrename関数のように第3引数を指定することはできません。

rename関数は「stdio.h」ヘッダで次のように宣言されています。

int rename(const char *old, const char *new);

この関数だけはポインタを2つ渡すのにrestrict修飾子がついていません。
そんなに最適化する必要がないという発想なのか、規格の不具合なのかは私にはわかりません。

さきほども書いたように、rename関数の呼び出しが成功したときはゼロを返し、失敗したときにはゼロ以外を返します。

なお、newで指定したのと同じ名前のファイルがすでに存在した場合はエ処理系定義になります。
名前の変更に成功した場合、もとのファイルにはアクセスできなくなります(コピーではありません)。

ざっと駆け足でしたが、ファイルの削除と名前の変更のための関数、removeとrenameを紹介しました。


今回の解説は以上となります。
次回はどうするかまだ考えていませんけど、そろそろワイド文字の解説をしてもいいかなと思います。