CreateFileでFileのアクセス


たま  2006-06-17 19:39:15  No: 62217

VC++6.0  SDKで作成しています。

  CreateFileでFileのアクセスをしようとしています。
  下記の文ですでにabcd.txtのFileが作成されていて、そのFileがOpen
  している状態ならばErrorとしたいのです。
  私の考えでは、現在、Open中においてはhFile==INVALID_HANDLE_VALUE
  が返ってくると思うのですが、思惑通りにいきません。
  どこが悪いのかアドバイスお願いします。

  char Test[260]="c:\\abcd.txt";

  HANDLE hFile;

  // File Open
  hFile = CreateFile(TyousinLogFileName,GENERIC_WRITE , 0 , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL, NULL);

  if (hFile==INVALID_HANDLE_VALUE){
        MessageBox(NULL, "File Write Error !",
        "Error!",MB_OK);
        return FALSE;
  }


たま  2006-06-17 19:40:46  No: 62218

すみません。一部間違えていました。

VC++6.0  SDKで作成しています。

  CreateFileでFileのアクセスをしようとしています。
  下記の文ですでにabcd.txtのFileが作成されていて、そのFileがOpen
  している状態ならばErrorとしたいのです。
  私の考えでは、現在、Open中においてはhFile==INVALID_HANDLE_VALUE
  が返ってくると思うのですが、思惑通りにいきません。
  どこが悪いのかアドバイスお願いします。

  char Test[260]="c:\\abcd.txt";

  HANDLE hFile;

  // File Open
  hFile = CreateFile(Test,GENERIC_WRITE , 0 , NULL , OPEN_ALWAYS , FILE_ATTRIBUTE_NORMAL, NULL);

  if (hFile==INVALID_HANDLE_VALUE){
MessageBox(NULL, "File Write Error !",
"Error!",MB_OK);
return FALSE;
  }


Blue  2006-06-17 19:46:55  No: 62219

MSDNのCreateFileの戻り値のところにこのようにかれています。
<MSDN>
戻り値

関数が成功すると、指定したファイルに対する、開いているハンドルが返ります。dwCreationDistribution パラメータで
 CREATE_ALWAYS または OPEN_ALWAYS を指定し、lpFileName パラメータで指定したファイルが既に存在している場合、
(CreateFile が成功した場合でも)GetLastError 関数は ERROR_ALREADY_EXISTS を返します。
CreateFile を実行する前にファイルが存在していない場合、GetLastError は 0 を返します。

関数が失敗すると、INVALID_HANDLE_VALUE が返ります。拡張エラー情報を取得するには、GetLastError 関数を使います。
</MSDN>
とあります。

なので、戻り値にかかわらず、GetLastErrorでERROR_ALREADY_EXISTSかどうか判定することに
なりそうです。

MSDN CreateFile
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_createfile.htm


YuO  2006-06-17 21:16:51  No: 62220

> 下記の文ですでにabcd.txtのFileが作成されていて、そのFileがOpen
> している状態ならばErrorとしたいのです。
> 私の考えでは、現在、Open中においてはhFile==INVALID_HANDLE_VALUE
> が返ってくると思うのですが、思惑通りにいきません。

ちゃんとINVALID_HANDLE_VALUEを返しましたが……。

対象のファイルは,システム的にちゃんと開かれていますか?
例えば,メモ帳で開いた状態は,実際にはファイルハンドルは閉じられているため,
システムから見ると開いている状態に含まれません。

> なので、戻り値にかかわらず、GetLastErrorでERROR_ALREADY_EXISTSかどうか判定することに
> なりそうです。

えーっと,読み方が違いますね。
「dwCreationDistribution パラメータで」から「GetLastError は 0 を返します。」までは,条件:「関数が成功すると」が効いています。
# どう考えても誤読してくださいといわんばかりの文章ですが……。
なので,dwShareMode違反でエラーの場合,GetLastErrorは0でもERROR_ALREADY_EXISTSでもなく,ERROR_SHARING_VIOLATIONを返します。


Blue  2006-06-17 22:42:34  No: 62221

> えーっと,読み方が違いますね。
ご指摘ありがとうございます。
つくづく日本語の理解力のなさに失望します。orz

こういうのは、自分で試してから回答すべきでした。

> たまさん
ということで、私の発言は見なかったことにしてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加