我正在创建一个文件句柄,以便在关闭时删除,并具有读取权限。我需要在不关闭句柄的情况下(因为它会删除文件)创建一个可以读取该文件的进程。
这是我的实现:我创建一个文件,在没有关闭的情况下尝试用记事本打开该文件,但它不能。我该如何解决这个问题。我想我可以成为 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;
}
Run Code Online (Sandbox Code Playgroud)
该标志的文档FILE_FLAG_DELETE_ON_CLOSE
说:
如果文件存在现有的打开句柄,则调用将失败,除非它们全部以
FILE_SHARE_DELETE
共享模式打开。
FILE_SHARE_DELET
除非指定 E 共享模式,否则对该文件的后续打开请求将失败。
记事本无法使用 来打开文件FILE_SHARE_DELETE
,因此无法使用 来打开文件ERROR_SHARING_VIOLATION
(“该进程无法访问该文件,因为该文件正在被另一个进程使用。”)。
由于您无法重写记事本,因此解决问题的唯一方法是不使用该FILE_FLAG_DELETE_ON_CLOSE
标志,或者使用记事本以外的其他程序以共享模式打开文件FILE_SHARE_DELETE
。