gpt4 book ai didi

c - 使用 FILE_FLAG_DELETE_ON_CLOSE 在子进程中共享读取文件的权限而不关闭句柄

转载 作者:行者123 更新时间:2023-12-03 09:27:58 27 4
gpt4 key购买 nike

我正在创建一个文件句柄,以便在关闭时删除,并具有读取权限。我需要在不关闭句柄的情况下(因为它会删除文件)创建一个可以读取文件的进程。

这是我的实现:我创建一个文件,在没有关闭的情况下尝试用记事本打开该文件,但它不能。我该如何解决这个问题。我想我可以在 CreateProcess 的参数中添加一些东西,但我不知道。

请帮忙。

#include <windows.h>

int main(int argc, char * argv[])
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
HANDLE hFile;
TCHAR text[] = "This is a text";
DWORD dwWrited;

hFile = CreateFile(
"data.txt",
GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_DELETE_ON_CLOSE
,NULL
);

WriteFile(hFile, text, sizeof(text), &dwWrited, NULL);
FlushFileBuffers(hFile);

memset(&pi, 0, sizeof(pi));
memset(&si, 0, sizeof(si));
CCreateProcess(TEXT("C:\\Windows\\System32\\Cmd.exe"),
TEXT("/C \"Notepad.exe data.txt\""),
NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);


puts("Press a key for close the file");
getchar();
CloseHandle(hFile);

return 0;
}

最佳答案

The documentation对于FILE_FLAG_DELETE_ON_CLOSE标志说:

If there are existing open handles to a file, the call fails unless they were all opened with the FILE_SHARE_DELETE share mode.

Subsequent open requests for the file fail, unless the FILE_SHARE_DELETE share mode is specified.

记事本无法打开 FILE_SHARE_DELETE 的文件,因此无法使用 ERROR_SHARING_VIOLATION 打开文件(“该进程无法访问该文件,因为该文件正在被另一个进程使用。”)。

由于您无法重写记事本,解决问题的唯一方法就是不使用 FILE_FLAG_DELETE_ON_CLOSE标志,或使用记事本以外的其他程序打开带有 FILE_SHARE_DELETE 的文件分享模式。

关于c - 使用 FILE_FLAG_DELETE_ON_CLOSE 在子进程中共享读取文件的权限而不关闭句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com