Я пишу фоновое приложение для циклического копирования файлов на USB-накопитель с набором политики «Оптимизировать для быстрого удаления». Однако, если флешка удалена в ходе этого процесса (в частности, в приведенном ниже вызове WriteFile (), который возвращает ОШИБКУ ФАЙЛА НЕ НАЙДЕНО), приложение зависает, диск становится постоянно недоступным из любого другого приложения, и ПК не может быть выключен / выход из системы / перезапуск и т. д. В результате все запущенные экземпляры Windows Explorer также зависают.
Я проследил проблему до вызова CloseHandle (), сделанного после того, как флешка удалена, и произошла вышеупомянутая ошибка. Это почти как если бы CloseHandle () блокировался где-то на неопределенное время в драйвере, потому что флешки больше нет? В любом случае, мне удалось обойти эту проблему, просто пропустив вызов CloseHandle (), если WriteFile () возвращает ERROR FILE NOT FOUND. Тем не менее, это приводит к другой проблеме, когда очень часто файл становится безвозвратно поврежденным, и единственный способ исправить это - использовать 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?
Спасибо за любую помощь.