仅在同一进程中多次打开临时文件

时间:2012-05-15 14:57:34

标签: c++ winapi file-io temporary-files

我对FILE_ATTRIBUTE_TEMPORARY标记的文件有疑问。 首先,这就是我想要做的事情:

我有一个DLL,它接受一个文件名,并在内部打开该文件并从中读取。我不知道这个文件是如何在里面处理的。 我想要给该DLL的文件将由我的进程创建。它必须是临时文件,其数据必须仅保存在RAM中,其他进程不得访问。所以我将Win32函数CreateFile()FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE一起使用。到目前为止,这很好。

我有一个测试代码,我测试文件是否可以第二次访问,同时仍然打开。这是:

HANDLE WINHandle = CreateFile("TempFileWIN.txt", (GENERIC_WRITE | GENERIC_READ) ,(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), 0, CREATE_ALWAYS, (FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE), 0);

ifstream ifs("TempFileWIN.txt", (ios::in | ios::trunc));

if(ifs.is_open())
{
    cout << "Success!" << endl;
}
else if(ifs.fail())
{
    cout << "Failed!" << endl;
}

我正在使用fstream测试是否可以使用流打开文件。那段代码不起作用。输出“失败!”。 我知道,该文件可以再次使用CreateFile打开。我查了一下。但是想知道是否可以通过与(例如)fstream一起工作的外部DLL打开文件。

我希望你能帮我解决这个问题。 最好的问候。

编辑: 也许更好的问题是我如何将文件锁定到我的进程并确保它永远不会被其他进程访问(即使我的进程被终止)。该文件必须可以使用C ++ fstream对象打开。

1 个答案:

答案 0 :(得分:0)

如果我是你,我会保留打开文件的句柄,并将其传递给DLL代码,而不是使用文件名,因为如果你尝试访问,你可能会在某些时候遇到访问限制使用“普通”文件访问权限暂时删除关闭文件。

可以在fstream对象中使用Windows句柄,如本答案中所述:https://stackoverflow.com/a/476014/393701