【问题标题】:errorCode for The process cannot access the file 'XYZ' because it is being used by another process进程无法访问文件“XYZ”的错误代码,因为它正被另一个进程使用
【发布时间】:2011-03-16 14:47:33
【问题描述】:

我使用 C# .NET,与 2008 年,.net 3.5 相比

对我来说,这很困难,但我需要 C# 中的示例代码:

  1. 如何获取 IOException 错误代码“进程无法访问文件 'XYZ',因为它正被另一个进程使用。”

例如,在我的问题中。

我尝试删除文件,但我得到“该进程无法访问文件 'XYZ',因为它正被另一个进程使用。”例外。

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."
}

但如果 .NET 是西班牙语,我会收到“El proceso no puede obtener acceso al archivo '00000004.PDF' porque está siendo utilizado en otro proceso”消息。

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()

我需要该异常的错误代码。在 Trace 中,我看到了 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

如何获取IOException错误码“进程无法访问文件'XYZ',因为它正在被另一个进程使用。”

【问题讨论】:

标签: c# file ioexception error-code delete-file


【解决方案1】:

您可能已经注意到 HResult 属性不可访问。解决方法是使用 Marshal.GetLastWin32Error() 方法来获取本机 Windows 错误代码。像这样:

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

错误代码 32 在 SDK 中被命名为 ERROR_SHARING_VIOLATION。

【讨论】:

    【解决方案2】:

    (IO-)Exception 上有一个 HResult 属性,其中包含错误代码。根据list,您的异常的错误代码应该是 0x20(不过我没有尝试过)。希望对您有所帮助。

    【讨论】:

    • 这是受保护的,所以没有反射就无法访问?
    • 它不受我保护。
    【解决方案3】:

    (标记为 CW,因为这实际上只是一个扩展注释)

    为什么需要错误代码?

    • 您是否要根据一个代码和另一个代码采取不同的操作?
    • 如果 Windows 或 .NET 发生变化,您会突然收到针对同一问题的不同错误代码,您会怎么做?
    • 如果您不能删除同一个文件,但出于不同的原因,您想做什么?事实上,也许你的新问题甚至不会抛出IOException

    【讨论】:

    • 我需要识别错误的代码,我想获取进程的名称(它正在被另一个进程使用)。
    • 您应该不需要“识别错误”。你打算如何处理这些信息?此外,您永远不会知道哪个进程打开了文件。 Windows 不提供该信息。请告诉我们您需要完成什么,也许我们可以提供帮助。
    • 我想找出错误。如果我因为另一个进程使用它而无法删除文件,我想是否有可能获取使用该文件的进程的名称,并向我的应用程序用户发出警告(或发送邮件)。我的 Windows 服务移动、删除大量文件,我需要完全控制所有文件和进程。
    • @alhambra:你永远不会拥有完全的控制权,也永远不会被告知哪个进程打开了文件。该信息不存在。
    • @alham:这些工具可能适用于共享上的文件,因为有软件必须跟踪这些文件。但一般来说,你不会得到这些信息。请注意,没有一个答案是关于如何知道是哪个文件的意思。
    【解决方案4】:

    查看 IOException 类的 HRESULT 属性。这应该返回操作的 Win32 HRESULT(我认为您正在寻找什么?)。

    【讨论】:

    • 这是受保护的,所以没有反射就无法访问?
    • @AlexAngas 无法通过代码访问,但您仍然可以通过调试器对其进行检查。
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2015-12-07
    • 2011-04-17
    相关资源
    最近更新 更多