首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单线程CreateFile() ERROR_SHARING_VIOLATION

单线程CreateFile() ERROR_SHARING_VIOLATION
EN

Stack Overflow用户
提问于 2014-07-29 19:41:54
回答 3查看 2.5K关注 0票数 0

为什么单个线程不能使用CreateFile和进程的独占文件锁打开同一个文件tqize?在第二次尝试通过同一个线程打开文件时,下面的示例将失败,其中包含一个ERROR_SHARING_VIOLATION异常:

ERROR_SHARING_VIOLATION 32 (0x20)进程无法访问该文件,因为它正被另一个进程使用。

强调上面的" process“这个词;是同一个进程(甚至是同一个线程)试图打开同一个文件。

代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-29 19:46:29

错误消息文本有点误导,但是两个对CreateFile的调用是从同一个进程中的同一个线程发出的,这并没有改变任何事情。一旦对CreateFile进行了第一次调用,那么随后对CreateFile的调用,无论它们来自何处,都必须遵守共享规则。

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

票数 4
EN

Stack Overflow用户

发布于 2014-07-29 19:46:56

那个古老的信息是误导的。打开文件的进程或线程并不重要。文件共享是基于句柄的。

票数 1
EN

Stack Overflow用户

发布于 2014-07-29 19:50:57

来自MSDN

dwShareMode: 如果此参数为零,并且CreateFile成功,则文件或设备不能共享,并且在关闭文件或设备的句柄之前不能再次打开。

这只是在谈论opening、文件或设备,而错误消息则是一般性的和令人困惑的。

不要试图重新打开文件,你应该握住句柄,做好你的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25023633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档