Я считаю, что это покрыто Windows Internals. Короче говоря, несмотря на то, что вы вызывали CloseHandle в дескрипторе файла, ядро может по-прежнему иметь выдающиеся ссылки, которые занимают несколько миллисекунд, чтобы закрыть.
Более надежный способ удаления файла, когда вы закончите, - использовать флаг FILE_FLAG_DELETE_ON_CLOSE при открытии последнего дескриптора. Это работает еще лучше, если вы не можете закрыть файл между чтением/записью.
#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;
}
Возможно, вы закрыли файл, прежде чем пытаться его удалить? Вы пропустили какие-либо ручки? – RageZ
Как я уже сказал, я даже проверил это с помощью инструментов WinInternals. Все открытые соединены с закрытием, но удаление не выполняется. И добавление спального места на 1 секунду устраняет проблему. –
Это могут быть окна, багги, но я сомневаюсь в этом.если добавление 'sleep' заставляет его работать, должно быть хорошо.^ – RageZ