如何判断IOException是否为"磁盘空间不足"异常类型?

目前,我判断消息是否与"磁盘空间不足"之类的信息匹配,但我知道如果操作系统语言不是英语,这将不起作用.

推荐答案

您需要判断HResult,并与can be converted to HResults by OR'ing with 0x80070000ERROR_DISK_FULL (0x70)ERROR_HANDLE_DISK_FULL (0x27)进行对比测试.

对于.Net Framework 4.5和更高版本,可以使用Exception.HResult属性:

static bool IsDiskFull(Exception ex)
{
    const int HR_ERROR_HANDLE_DISK_FULL = unchecked((int)0x80070027);
    const int HR_ERROR_DISK_FULL = unchecked((int)0x80070070);

    return ex.HResult == HR_ERROR_HANDLE_DISK_FULL 
        || ex.HResult == HR_ERROR_DISK_FULL;
}

对于较旧的版本,您可以使用Marshal.GetHRForException来取回HResult,但是这个has significant side-effects and is not recommended:

static bool IsDiskFull(Exception ex)
{
    const int ERROR_HANDLE_DISK_FULL = 0x27;
    const int ERROR_DISK_FULL = 0x70;

    int win32ErrorCode = Marshal.GetHRForException(ex) & 0xFFFF;
    return win32ErrorCode == ERROR_HANDLE_DISK_FULL || win32ErrorCode == ERROR_DISK_FULL;
}

从MSDN文档中:

请注意,GetHRForException方法设置了

另见第How do I determine the HResult for a System.IO.IOException?

.net相关问答推荐

Azure Function应用程序-如何升级.NET运行时

从窗体中移除另一个控件中引用的控件时获取设计时通知

在 Invoke() 中运行时,跨线程操作对表单控件无效 - .NET

保存时不保留 XML 格式

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

为什么 .NET 中的 System.Version 定义为 Major.Minor.Build.Revision?

为什么这个多态 C# 代码会打印它的功能?

是什么让 Enum.HasFlag 这么慢?

使文本框不可编辑

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

如何获得 Bin 路径?

C# (.NET) 设计缺陷

无法加载文件或程序集System.ValueTuple

C# List<> 按 x 然后 y 排序

如何将 VB 项目转换为 C# 项目

从 Visual Studio 2015 发布 - 允许不受信任的证书

.NET Remoting 真的被弃用了吗?

C# 应用程序中的资源和嵌入式资源有什么区别?

Uri.Host 和 Uri.Authority 有什么区别

App.config:用户与应用程序范围