【问题标题】:Can CreateFile() Open one file at the same time in two different threadCreateFile() 可以在两个不同的线程中同时打开一个文件吗
【发布时间】:2010-12-07 06:22:42
【问题描述】:

CreateFile() 可以在两个不同的线程中同时打开一个文件


void new_function(void * what) {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | 
                  FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (h == INVALID_HANDLE_VALUE)
{
    DWORD d = GetLastError();
    return ;
}
Sleep(10000);

}

int main() {

HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

Sleep(10000);
return 1;

}


每次它在GetLastError 位置退出。错误是ERROR_SHARING_VIOLATION (32, "The 进程无法访问该文件,因为它正被另一个进程使用 过程。”)

如果我不能共享打开文件,那么FILE_SHARE_WRITE | FILE_SHARE_READ有什么用

感谢

The program environment is Win32 Vs2003

【问题讨论】:

  • 你需要说什么语言,什么操作系统,什么版本。
  • 在我看来像 C。 CreateFile 是一个 Win32() API。你会希望他更好地标记它......他是 24 天前加入的 63 名声望用户。保持平静。感谢您重新标记它。

标签: c winapi createfile


【解决方案1】:

文件句柄总是在线程之间共享。您需要做的只是照常使用句柄,但在两个线程上。

您对CreateFile() 的第二次调用失败,因为您请求的访问权限GENERIC_ALL 超过了您允许的共享访问权限FILE_SHARE_WRITE | FILE_SHARE_READ

如果您只请求GENERIC_READ | GENERIC_WRITE,它将成功。

CreateFile() 在单个线程上调用的行为将是相同的。

【讨论】:

  • 非常感谢............我将GENERIC_ALL更改为GENERIC_READ | GENERIC_WRITE。我得到了正确的答案
  • 您也可以添加 FILE_SHARE_DELETE。这取决于你想从文件中得到什么。
  • 您不应该添加 FILE_SHARE_DELETE,因为您想请求所需的最低权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 2017-10-25
相关资源
最近更新 更多