为什么单个线程不能使用CreateFile
和独占文件锁打开同一个文件tqize?以下示例将在第二次尝试通过具有ERROR_SHARING_VIOLATION
异常的同一线程打开文件时失败:
ERROR_SHARING_VIOLATION 32(0x20)进程无法访问该文件 因为它正由另一个进程使用。
强调上述“过程”一词;尝试打开同一个文件twize是同一个进程(甚至同一个线程)。
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hOutputFile1 = CreateFile(
// File name
L"test.dat",
// Requested access to the file
GENERIC_READ | GENERIC_WRITE,
// Share mode. 0 equals exclusive lock for the process
0,
// Pointer to a security attribute structure
NULL,
// Action to take on file
OPEN_ALWAYS,
// File attributes and flags
FILE_ATTRIBUTE_NORMAL,
// Template file
NULL
);
if (hOutputFile1 == INVALID_HANDLE_VALUE)
{
// Error
DWORD lastError = GetLastError();
return (int)lastError;
}
// opening the same file for the second time will return a ERROR_SHARING_VIOLATION exception
HANDLE hOutputFile2 = CreateFile(
// File name
L"test.dat",
// Requested access to the file
GENERIC_READ | GENERIC_WRITE,
// Share mode. 0 equals exclusive lock by the process
0,
// Pointer to a security attribute structure
NULL,
// Action to take on file
OPEN_ALWAYS,
// File attributes and flags
FILE_ATTRIBUTE_NORMAL,
// Template file
NULL
);
if (hOutputFile2 == INVALID_HANDLE_VALUE)
{
// Error
DWORD lastError = GetLastError();
return (int)lastError;
}
return 0;
}
答案 0 :(得分:4)
错误消息文本有点误导,但是对CreateFile
的两次调用是在同一进程中从同一个线程进行的,这一事实并没有改变。第一次拨打CreateFile
后,对CreateFile
的后续呼叫,无论其来源如何,都必须遵守共享规则。
我猜错误消息文本会尝试捕获共享冲突的最常见来源。即两个进程竞争同一个文件。但一个简单的事实是,一旦您打开了一个具有独占共享的文件,那么打开该文件的其他尝试都无法成功。
答案 1 :(得分:1)
这条旧信息具有误导性。什么进程或线程正在打开文件并不重要。文件共享是基于句柄的。
答案 2 :(得分:0)
来自MSDN:
dwShareMode [in]:
如果此参数为零且CreateFile成功,则为文件或设备 无法共享,无法再次打开,直到句柄 文件或设备已关闭。
这只是在讨论opening
文件或设备,而错误信息是一般性的,令人困惑的。
您应该握住句柄并完成工作,而不是尝试重新打开文件。