0

我有一个关于FILE_ATTRIBUTE_TEMPORARY标记文件的问题。首先,这是我想要做的:

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

我有一个 tes 代码,我在其中测试文件是否可以在仍然打开的情况下再次访问。这里是:

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 对象打开。

4

1 回答 1

0

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

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

于 2012-05-16T08:40:44.337 回答