为什么单个线程无法使用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;
}
最佳答案
错误消息文本有点让人误解,但是对CreateFile
的两个调用是在同一进程中从同一线程进行的,这一事实并没有改变。首次调用CreateFile
后,随后的CreateFile
调用(无论它们来自何处)都必须遵守共享规则。
我猜错误消息文本试图捕获共享冲突的最常见来源。即两个进程争用同一文件。但是,简单的事实是,一旦您以独占共享打开了文件,那么其他任何打开该文件的尝试都不会成功。
关于c++ - 具有单线程的CreateFile()ERROR_SHARING_VIOLATION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25023633/