Ich glaube, das in Windows Internals bedeckt ist. Die kurze Geschichte ist, dass, obwohl Sie CloseHandle auf dem Datei-Handle aufgerufen haben, der Kernel noch ausstehende Verweise haben kann, die ein paar Millisekunden zum Schließen benötigen.
Eine zuverlässigere Möglichkeit, die Datei zu löschen, wenn Sie fertig sind, ist die Verwendung des FILE_FLAG_DELETE_ON_CLOSE-Flags beim Öffnen des letzten Handles. Dies funktioniert sogar noch besser, wenn Sie vermeiden können, die Datei zwischen Lese-/Schreibvorgängen zu schließen.
#include <windows.h>
#include <stdio.h>
int wmain(int argc, wchar_t** argv)
{
LPCWSTR fileName = L"c:\\temp\\test1234.bin";
HANDLE h1 = CreateFileW(
fileName,
GENERIC_WRITE,
// make sure the next call to CreateFile can succeed if this handle hasn't been closed yet
FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_TEMPORARY,
NULL);
if (h1 == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "h1 failed: 0x%x\n", GetLastError());
return GetLastError();
}
HANDLE h2 = CreateFileW(
fileName,
GENERIC_READ,
// FILE_SHARE_WRITE is required in case h1 with GENERIC_WRITE access is still open
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
// tell the OS to delete the file as soon as it is closed, no DeleteFile call needed
FILE_FLAG_DELETE_ON_CLOSE | FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_TEMPORARY,
NULL);
if (h2 == INVALID_HANDLE_VALUE)
{
fprintf(stderr, "h2 failed: 0x%x\n", GetLastError());
return GetLastError();
}
return 0;
}
Sind Sie sicher, dass Sie die Datei richtig, bevor Sie versuchen, sie löschen schließen? Hast du irgendwelche Griffe verpasst? – RageZ
Wie ich schon sagte, habe ich das sogar mit WinInternals-Tools überprüft. Alle Öffnen werden mit Schließen gepaart, aber die Löschung schlägt fehl. Und das Hinzufügen von Schlaf für 1 Sekunde behebt das Problem. –
Es könnte sein, dass Windows Buggy ist, aber ich bin etwas zweifelhaft. Wenn das Hinzufügen des "Schlafes" es funktionieren sollte, sollte es in Ordnung sein ^^ – RageZ