views:

104

answers:

4

I using C# .NET , vs 2008 , .net 3.5

For me, is difficult, but I need sample code in C# for this:

  1. How get the error code of IOException "The process cannot access the file 'XYZ' because it is being used by another process."

For example, in my issue.

I try delete file, and I get "The process cannot access the file 'XYZ' because it is being used by another process." Exception.

try
{
    File.Delete(infoFichero.Ruta);
}
catch (IOException ex)
{
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}

But if .NET is Spanish, I get "El proceso no puede obtener acceso al archivo '00000004.PDF' porque está siendo utilizado en otro" message.

System.IO.IOException: El proceso no puede obtener acceso al archivo '00000004.PDF' porque está siendo utilizado en otro proceso.
   en System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   en System.IO.FileInfo.Delete()

I need a ERROR CODE for that Exception. In Trace, I have seen System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

How get the error code of IOException "The process cannot access the file 'XYZ' because it is being used by another process."

Please, any sample code, I ask for help gurus, MVPs, anyone...

A: 

Have a look at the HRESULT property of the IOException class. This should return the Win32 HRESULT of the operation (which is what I think you're looking for?).

Coding Gorilla
+1  A: 

Hi,

there's an HResult property on (IO-)Exception that contains an error code. According to this list the error code for your exception should be 0x20 (I didn't try that though). Hope that helps.

andyp
+1  A: 

(marked CW because this is really just an extended comment)

Why do you need the error code?

  • Are you going to take a different action based on one code versus another code?
  • What will you do if Windows or .NET changes, so that you're suddenly getting a different error code back for the same problem?
  • What do you want to do if you can't delete the same file, but for a different reason? In fact, maybe your new problem won't even throw an IOException.
John Saunders
+2  A: 

You might have noticed that the HResult property is not accessible. The workaround is to use the Marshal.GetLastWin32Error() method to get the native Windows error code. Like this:

        catch (IOException ex) {
            int err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
            if (err == 32) Console.WriteLine("It's locked");
            // etc..
        }

Error code 32 is named ERROR_SHARING_VIOLATION in the SDK.

Hans Passant