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;
}
すみません。一部間違えていました。
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;
}
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
> 下記の文ですでに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を返します。
> えーっと,読み方が違いますね。
ご指摘ありがとうございます。
つくづく日本語の理解力のなさに失望します。orz
こういうのは、自分で試してから回答すべきでした。
> たまさん
ということで、私の発言は見なかったことにしてください。
ツイート | ![]() |