CreateFileでFileのアクセス


たま  2006-06-17 10:39:15  No: 62217  IP: 192.*.*.*

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 10:40:46  No: 62218  IP: 192.*.*.*

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

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 10:46:55  No: 62219  IP: 192.*.*.*

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 12:16:51  No: 62220  IP: 192.*.*.*

> 下記の文ですでに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 13:42:34  No: 62221  IP: 192.*.*.*

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

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

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

編集 削除