Jak usunąć CreateFile
Powiedzmy, że piszę dane do uchwytu pliku:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
Jeśli mój zapis danych nie powiedzie się, chcę, aby plik byłusunięte kiedy zamknę uchwyt. To znaczy: chcę, żeby plik był„un-CreatFile'd”.
wypróbowałem to, co oczywiste, usuń plik, jeśli wystąpił problem:
hFile = CreateFile(filename, GENERICREAD | GENERICWRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//[snip error check]
try
{
try
{
if (!WriteFile(hFile, buffer, count, ref bytesWritten, null))
throw new Win32Exception(GetLastError());
}
finally
{
CloseHandle();
}
}
catch
{
DeleteFile(filename);
throw;
}
Istnieją dwa problemy z tym podejściem:
Jest sytuacja wyścigu, w której ktoś może otworzyć mój plik po zamknięciu go, ale zanim go usunęmógłbym mieć pozwolenieStwórz plik, ale nieKasować to.Chciałbym znaleźć sposóbz mocą wsteczną sprecyzować:
FILE_FLAG_DELETE_ON_CLOSE
: Plik należy usunąć natychmiast po zamknięciu wszystkich jego uchwytów, w tym określonego uchwytu i innych otwartych lub zduplikowanych uchwytów.
do pliku, który mam otwarty.
stworzyłem plik! Z pewnością mogę go uwolnić! Wszystko dlatego, że zapomniałem podać flagę przed rozdaniem?