fopen でファイルの存在判定は可能か?
2004年10月8日 C言語JIS C の fopen 関数を使用してファイルの存在を確かめる方法が、あるホームページに書かれていました。二番目の引数 mode に "r" を指定してファイルをオープンし、その結果で、最初の引数に指定したファイルの存在を判定するというものです。オープンに成功した場合は存在すると判定し、失敗した場合は存在しないと判定します。
確かに存在しないファイルを ’r’ で始まる mode 引数でオープンすると失敗します。*1しかし、その他の理由で失敗することは無いのでしょうか?
疑問に思ったので JIS C を調べてみました。
(*1) 存在しないファイルを、’r’ で始まらない mode 引数でオープンすると、(何らかの原因によりファイルが生成出来ない場合を除き)ファイルが新しく生成されます。
調べた結果、下記の記述を見つけました。
●JIS C (JIS X 3010-1993) 7.9.5.3 より一部引用
この引用部から、’r’ で始まる mode 引数でオープンする場合、ファイルが存在していても読取り操作が許されていない場合は、オープンに失敗するということが分かります。
これでは、「オープン失敗 = ファイルが存在しない」という関係が成り立ちません。
つまり、fopen 関数の結果でファイルの存在判定を行うことは出来ないのです。
では、読取り操作が禁止されることのないファイルシステムであれば、fopen 関数でファイルの存在判定を行うことが出来るのでしょうか?
調べた結果、下記の記述を見つけました。
●JIS C (JIS X 3010-1993) 7.9.1 より一部引用
この引用部から、( stdio.h ヘッダ で宣言されている) FOPEN_MAX マクロ値を越えるの数のファイルを一度にオープンしようとすると、オープンに失敗する可能性があることが分かります。
つまり、読取り操作が禁止されることのないファイルシステムにおいても、fopen 関数の結果でファイルの存在判定を行うことは出来ないのです。
【蛇足】下記の記述も見つけました。
●JIS C (JIS X 3010-1993) 7.9.3 より一部引用
この引用部から、ファイルが存在していても既にオープンされてる場合、同一ファイルを同時に複数回オープン出来ない処理系では、必ずオープンに失敗するということが分かります。
確かに存在しないファイルを ’r’ で始まる mode 引数でオープンすると失敗します。*1しかし、その他の理由で失敗することは無いのでしょうか?
疑問に思ったので JIS C を調べてみました。
(*1) 存在しないファイルを、’r’ で始まらない mode 引数でオープンすると、(何らかの原因によりファイルが生成出来ない場合を除き)ファイルが新しく生成されます。
調べた結果、下記の記述を見つけました。
●JIS C (JIS X 3010-1993) 7.9.5.3 より一部引用
存在しないファイル又は読取り操作が許されていないファイルに対する読取りモードでのオープン(mode実引数の最初の文字が’r’の場合)は失敗する。
この引用部から、’r’ で始まる mode 引数でオープンする場合、ファイルが存在していても読取り操作が許されていない場合は、オープンに失敗するということが分かります。
これでは、「オープン失敗 = ファイルが存在しない」という関係が成り立ちません。
つまり、fopen 関数の結果でファイルの存在判定を行うことは出来ないのです。
では、読取り操作が禁止されることのないファイルシステムであれば、fopen 関数でファイルの存在判定を行うことが出来るのでしょうか?
調べた結果、下記の記述を見つけました。
●JIS C (JIS X 3010-1993) 7.9.1 より一部引用
FOPEN_MAX
は、同時にオープンできることを処理系が保証するファイルの最小数を表す汎整数定数式に展開する。
この引用部から、( stdio.h ヘッダ で宣言されている) FOPEN_MAX マクロ値を越えるの数のファイルを一度にオープンしようとすると、オープンに失敗する可能性があることが分かります。
つまり、読取り操作が禁止されることのないファイルシステムにおいても、fopen 関数の結果でファイルの存在判定を行うことは出来ないのです。
【蛇足】下記の記述も見つけました。
●JIS C (JIS X 3010-1993) 7.9.3 より一部引用
同一ファイルを同時に複数回オープンすることが可能かどうかも、処理系定義とする。
この引用部から、ファイルが存在していても既にオープンされてる場合、同一ファイルを同時に複数回オープン出来ない処理系では、必ずオープンに失敗するということが分かります。
コメント