Это может сработать:
- В процессе, который создает файл, создайте его с помощью FileOptions.DeleteOnClose и FileShare.ReadWrite (или FileShare.Read, если для других процессов требуется только доступ на чтение). Вам также может понадобиться FileShare.Delete.
- НЕ позволяйте файлу закрываться в главном приложении, которое его создало, до тех пор, пока приложение не закроется.
- В других процессах, которые используют временный файл, откройте его с теми же параметрами файла, что и у исходного.
Таким образом, когда последний процесс с открытым файлом закрывается, файл будет удален.
UPDATE:
Как отмечается в комментариях, в API .NET, похоже, нет способа указать обе опции FIleShare и FileOptions.DeleteOnClose. Это возможно с помощью прямой Win32. Я скопировал образец, который я тестировал ниже. Есть 2 программы, одна создает файл, другая использует его. Единственное заметное различие между этими двумя параметрами заключается в том, что потребитель открывает файл с помощью OPEN_EXISTING.
Creator
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE fh = CreateFile(
L"yourFilePath\\tempFile.dat",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
CREATE_NEW,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if(fh==INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
return 1;
}
std::cout<< "Hit enter to close.";
std::string inp;
std::getline(std::cin,inp);
CloseHandle(fh);
return 0;
}
Потребитель
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE fh = CreateFile(
L"yourFilePath\\tempFile.dat",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE,
NULL);
if(fh==INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
return 1;
}
DWORD written;
if(!WriteFile(fh,"Test",4,&written,NULL))
{
std::cerr << "Failed to write data to file. Error code = " << GetLastError() << std::endl;
return 1;
}
std::cout<< "Hit enter to close.";
std::string inp;
std::getline(std::cin,inp);
CloseHandle(fh);
return 0;
}