【问题标题】:Does an IO exception get thrown if the disk is full?如果磁盘已满,是否会引发 IO 异常?
【发布时间】:2020-05-03 17:06:30
【问题描述】:

尝试写入文件但磁盘已满时,.NET Framework 中会引发什么异常?

Windows 是否缓冲文件写入?

【问题讨论】:

  • 你为什么不试试看 - 插入一个 U 盘并继续向它写入垃圾,直到你的空间用完,看看会发生什么。我怀疑你会在写入时得到一个托管的IOException,它将超过限制,因为缓冲过程对托管代码应该是不透明的。
  • C# 是一种编程语言 - 由于文件系统已满,它什么也不做。您的意思是“.NET 中的 IO 异常是否被抛出...”

标签: c# .net


【解决方案1】:

你会得到一个 IO 异常:

System.IO.IOException: There is not enough space on the disk.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

System.IO 库处理读取和写入磁盘的实际任务,并将它们包装在托管代码中,因此使用它们时不应出现任何非托管异常。

也值得一试(使用他们随处分发的劣质小型 USB 记忆棒之一)看看你的代码会发生什么 - 这通常是找出这类事情的最佳方法。

【讨论】:

  • 我也想知道何时抛出异常的确切答案
  • 当你在一个完整的磁盘上尝试写操作(或者打开一个文件进行写,我认为)时会抛出异常。全盘读取操作不会抛出异常。
【解决方案2】:

您可以在失败后检查 Win 32 异常,看看是否提供了更多详细信息:

     Win32Exception ex = new Win32Exception();
     string low_level_error = ex.Message;

你是如何写入磁盘的?对于FileStream,它说:

"一定要调用 Dispose 方法 所有 FileStream 对象,尤其是在 磁盘空间有限的环境。 执行 IO 操作会引发 如果没有磁盘空间则异常 可用并且 Dispose 方法是 在 FileStream 之前未调用 最终确定。”

【讨论】:

    【解决方案3】:

    您将收到“IOException”。但问题是“IOException”的范围很广,不仅仅是磁盘已满。我建议还检查内部的“HResult”以精确过滤掉这种情况。

                    catch (IOException ioEx)
                    {
                        // Is it 'DISK_FULL'?
                        uint unsignedResult = (uint)ioEx.HResult;
                        if (unsignedResult.IsOneOf(0x80000027, 0x80000070, 0x80070027, 0x80070070))
                        {
                            // Remove the partial file
                            try
                            {
                                File.Delete(pathName);
                            }
                            catch { }
                            // do your special stuff here
                        }
                        else
                            throw;
                    }
    

    请注意,来自区域 8000 的 Win32 错误代码镜像在区域 8007 中,这就是检查中几乎重复的原因。

    【讨论】:

      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多