为什么单个线程不能使用CreateFile和进程的独占文件锁打开同一个文件tqize?在第二次尝试通过同一个线程打开文件时,下面的示例将失败,其中包含一个ERROR_SHARING_VIOLATION异常:
ERROR_SHARING_VIOLATION 32 (0x20)进程无法访问该文件,因为它正被另一个进程使用。
强调上面的" process“这个词;是同一个进程(甚至是同一个线程)试图打开同一个文件。
#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;
}发布于 2014-07-29 19:46:29
错误消息文本有点误导,但是两个对CreateFile的调用是从同一个进程中的同一个线程发出的,这并没有改变任何事情。一旦对CreateFile进行了第一次调用,那么随后对CreateFile的调用,无论它们来自何处,都必须遵守共享规则。
我猜错误消息文本试图捕获最常见的共享违规源。即两个进程竞争同一个文件。但是简单的事实是,一旦您打开了一个具有独占共享的文件,那么任何其他打开该文件的尝试都无法成功。
发布于 2014-07-29 19:46:56
那个古老的信息是误导的。打开文件的进程或线程并不重要。文件共享是基于句柄的。
发布于 2014-07-29 19:50:57
来自MSDN:
dwShareMode: 如果此参数为零,并且CreateFile成功,则文件或设备不能共享,并且在关闭文件或设备的句柄之前不能再次打开。
这只是在谈论opening、文件或设备,而错误消息则是一般性的和令人困惑的。
不要试图重新打开文件,你应该握住句柄,做好你的工作。
https://stackoverflow.com/questions/25023633
复制相似问题