fopen vs CFile::Open vs _access

ファイルの書き込みオープンのチェックに関して

以下の3つの処理の違い、ご存知だろうか?

1. fopenを使う場合

FILE *fp = fopen(file_name, "w");
if (fp == NULL) {
   return;
}
fclose(fp);

2. CFile::Openを使う場合

CFile file;
if (file.Open(file_name, CFile::modeWrite) == 0) {
   return;
}
file.Close();

3. _accessを使う場合

if (_access(file_name, 2) != 0) {
   return;
}

GetFileAttributeってのもあるか。
ファイルを実際に開いてるかは置いておいて、
他のアプリがファイルを使っていてロックしているときに
fopenだとエラーを返してくれるのに、他2つはスルーしちゃうことがあった。
CFileで実際に書き込むとどうなるかは試してないけど、
CFileの方で事前にチェックして、書き込み処理はfopenで開こうとして失敗ってことがあった。(∞ループで、無応答)
まぁ、そこのエラー処理が甘かったってのがあるんだけど。
気をつけなはれやっ!