Я пишу фоновое приложение для циклического копирования файлов на USB-накопитель с установленной политикой «Оптимизировать для быстрого удаления». Однако, если флешка удаляется на полпути в ходе этого процесса (в частности, в вызове WriteFile() ниже, который возвращает ФАЙЛ ОШИБКИ НЕ НАЙДЕН), приложение зависает, накопитель становится постоянно недоступным для любого другого приложения, и ПК нельзя выключить/выключить. вышел из системы / перезапустился и т. д. В результате все запущенные экземпляры Windows Explorer также зависают.
Я проследил проблему до вызова CloseHandle(), сделанного после того, как палка была удалена, и возникла вышеуказанная ошибка. Как будто CloseHandle() где-то в драйвере блокируется на неопределенный срок, потому что палки больше нет? Во всяком случае, мне удалось обойти эту проблему, просто пропустив вызов CloseHandle(), если WriteFile() возвращает ФАЙЛ ОШИБКИ НЕ НАЙДЕН. Однако это приводит к другой проблеме, когда время от времени файл безвозвратно повреждается, и единственный способ исправить это — использовать chkdsk или переформатировать флешку.
Обратите внимание, что это происходит только в XP (SP2 и 3), Vista, похоже, не страдает от этой проблемы. Далее следует фрагмент кода:
HANDLE hFile = CreateFile(szFile,
GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
CREATE_ALWAYS,
FILE_FLAG_WRITE_THROUGH,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
if (!WriteFile(hFile, pBuffer, dwBufferSize, &dwWritten))
{
int nLastError = GetLastError();
}
// If usb stick is removed during WriteFile(), ERROR_FILE_NOT_FOUND usually results.
// If handle is closed at this point then drive is inaccessible.
// If CloseHandle() is skipped, then file corruption occurs instead
if (nLastError != ERROR_FILE_NOT_FOUND)
{
CloseHandle(hFile);
}
}
Я пробовал почти все комбинации флагов для CreateFile(), но все безрезультатно. Кто-нибудь видел это раньше или есть хорошие идеи, как избежать возникновения любой из двух проблем. Является ли то, что я вижу, проблемой драйвера, которая была незаметно устранена в Vista?
Спасибо за любую помощь.