public static void RetryOnWin32Error(Action func)
{
- bool IsWin32FileLockError(int hresult)
+ bool IsKnownIrrecoverableError(int hresult)
{
// Error codes are defined in winerror.h
- const int ErrorLockViolation = 33;
- const int ErrorDriveLocked = 108;
-
// The error code is stored in the lowest 16 bits of the HResult
- int errorCode = hresult & 0xffff;
- return errorCode == ErrorLockViolation || errorCode == ErrorDriveLocked;
+ switch (hresult & 0xffff)
+ {
+ case 0x00000001: // ERROR_INVALID_FUNCTION
+ case 0x00000002: // ERROR_FILE_NOT_FOUND
+ case 0x00000003: // ERROR_PATH_NOT_FOUND
+ case 0x00000006: // ERROR_INVALID_HANDLE
+ case 0x00000008: // ERROR_NOT_ENOUGH_MEMORY
+ case 0x0000000B: // ERROR_BAD_FORMAT
+ case 0x0000000E: // ERROR_OUTOFMEMORY
+ case 0x0000000F: // ERROR_INVALID_DRIVE
+ case 0x00000012: // ERROR_NO_MORE_FILES
+ case 0x00000035: // ERROR_BAD_NETPATH
+ case 0x00000057: // ERROR_INVALID_PARAMETER
+ case 0x00000071: // ERROR_NO_MORE_SEARCH_HANDLES
+ case 0x00000072: // ERROR_INVALID_TARGET_HANDLE
+ case 0x00000078: // ERROR_CALL_NOT_IMPLEMENTED
+ case 0x0000007B: // ERROR_INVALID_NAME
+ case 0x0000007C: // ERROR_INVALID_LEVEL
+ case 0x0000007D: // ERROR_NO_VOLUME_LABEL
+ case 0x0000009A: // ERROR_LABEL_TOO_LONG
+ case 0x000000A0: // ERROR_BAD_ARGUMENTS
+ case 0x000000A1: // ERROR_BAD_PATHNAME
+ case 0x000000CE: // ERROR_FILENAME_EXCED_RANGE
+ case 0x000000DF: // ERROR_FILE_TOO_LARGE
+ case 0x000003ED: // ERROR_UNRECOGNIZED_VOLUME
+ case 0x000003EE: // ERROR_FILE_INVALID
+ case 0x00000651: // ERROR_DEVICE_REMOVED
+ return true;
+
+ default:
+ return false;
+ }
}
for (int i = 1; i <= NumberOfRetries; i++)
break;
}
catch (HResultException hrex)
- when (i < NumberOfRetries && IsWin32FileLockError(hrex.Win32HResult))
+ when (i < NumberOfRetries && !IsKnownIrrecoverableError(hrex.Win32HResult))
{
Thread.Sleep(NumMilliSecondsToWait);
}