单线程CreateFile()ERROR_SHARING_VIOLATION

时间:2014-07-29 19:41:55

标签: c++ windows file-io

为什么单个线程不能使用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;
}

3 个答案:

答案 0 :(得分:4)

错误消息文本有点误导,但是对CreateFile的两次调用是在同一进程中从同一个线程进行的,这一事实并没有改变。第一次拨打CreateFile后,对CreateFile的后续呼叫,无论其来源如何,都必须遵守共享规则。

我猜错误消息文本会尝试捕获共享冲突的最常见来源。即两个进程竞争同一个文件。但一个简单的事实是,一旦您打开了一个具有独占共享的文件,那么打开该文件的其他尝试都无法成功。

答案 1 :(得分:1)

这条旧信息具有误导性。什么进程或线程正在打开文件并不重要。文件共享是基于句柄的。

答案 2 :(得分:0)

来自MSDN

  

dwShareMode [in]:

     

如果此参数为零且CreateFile成功,则为文件或设备   无法共享,无法再次打开,直到句柄   文件或设备已关闭。

这只是在讨论opening文件或设备,而错误信息是一般性的,令人困惑的。

您应该握住句柄并完成工作,而不是尝试重新打开文件。