为什么单个线程无法使用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/

10-13 07:18