2

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

这是我的实现:我创建了一个文件,没有关闭我尝试用记事本打开文件,但它不能。我该如何解决这个问题。我想我可以是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;
}
4

1 回答 1

4

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共享模式打开文件。

于 2013-04-30T17:18:51.917 回答