0

FILE_ATTRIBUTE_TEMPORARYマークされたファイルについて質問があります。まず、これが私がやりたいことです:

私はファイル名を取り、そのファイルを内部で開いてそこから読み取るDLLを持っています。このファイルが内部でどのように処理されるのかわかりません。そのDLLに渡したいファイルは、私のプロセスによって作成されます。これは一時ファイルである必要があり、そのデータはRAMにのみ保持され、他のプロセスからアクセスされないようにする必要があります。そのため、Win32関数CreateFile()をとでFILE_ATTRIBUTE_TEMPORARY使用しFILE_FLAG_DELETE_ON_CLOSEます。これまでのところうまくいきます。

開いたままでファイルに2回アクセスできるかどうかをテストするテストコードがあります。ここにあります:

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を使用して、ファイルをストリームで開くことができるかどうかをテストしています。そこにあるそのコードは機能しません。出力は「Failed!」です。ファイルをCreateFileでもう一度開くことができることは知っています。私はそれをチェックしました。ただし、(たとえば)fstreamで動作する外部DLLによってファイルを開くことが可能かどうかを知りたい。

私はあなたがこの問題で私を助けてくれることを願っています。よろしくお願いします。

編集:おそらくより良い質問は、ファイルを自分のプロセスにロックして、他のプロセスからアクセスできないようにする方法です(プロセスが強制終了された場合でも)。ファイルは、C++fstreamオブジェクトで開くことができる必要があります。

4

1 に答える 1

0

もし私があなたなら、開いているファイルのハンドルを保持し、それを DLL コードに渡します。ファイル名は使用しません。 「通常の」ファイルアクセスを使用して閉じるときに削除するファイル。

この回答で説明されているように、fstream オブジェクトで Windows ハンドルを使用することができます: https://stackoverflow.com/a/476014/393701

于 2012-05-16T08:40:44.337 に答える