shareDenyWrite

(なんかタイトル変だったから直した)


こういう処理があったとして。

static HANDLE OpenShareFile(LPCTSTR lpszFilePath)
{
	UINT nFlgs = FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE;
	return ::CreateFile(lpszFilePath, GENERIC_READ,	nFlgs, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}

メイン関数の方でこういう風に書かれているとして。

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
		return 1;

	const CString sFile = _T("c:\\test.log");
	HANDLE hFile = OpenShareFile(sFile);
	// x
	::CloseHandle(hFile);

	return 0;
}

「// x」の部分が下記だとファイルはオープンに成功して、

CStdioFile writer(sFile, CFile::modeCreate | CFile::shareDenyWrite);

下記だとオープン失敗。

CStdioFile writer(sFile, CFile::modeCreate);


なんで?
shareDenyWriteはそんなにえらいの?
後、shareDenyWriteをうっかりつけずにオープンしちゃってるヒトが出力するファイルを監視してると、時々出力する側がファイルオープンに失敗しちゃうわけなんだけど、これはどうしようもないの?


教えてエロい人!