当磁盘上没有空闲 space 时,Image.Save 不会抛出异常

No exception thrown on Image.Save when no free space on disk

我正在服务器上保存图像,我正在处理磁盘没有可用空间的情况 space。为了模拟这一点,我创建了一个几乎没有 space 的虚拟硬盘驱动器,我试图将图像保存在那里。

我原以为在尝试保存图像时会收到异常,其中:

using (var ms = new MemoryStream(myPictureStream))
using (Image image = Image.FromStream(ms))
{
    image.Save(fileName, ImageFormat.Jpeg);
}

但事实并非如此,没有抛出异常。相反,保存了一个空文件,所以我无法意识到错误。 我希望在尝试保存图像时收到一些错误,或者能够在抛出异常之前预测错误。

我已经考虑了一些可能的解决方案:

所以...知道为什么 Image.Save() 在没有可用的 space 时不会抛出错误吗?关于如何处理这种情况有什么建议吗?

编辑

GetLastError 没有帮助(它是代码 0,成功),所以似乎 处理这种情况的最佳方法是将图像保存到时间 MemoryStream然后将其写入文件,正如@Eldar 和@nvoigt 给出的答案所指出的那样。

这样做,抛出一个IOException,可以查看异常的HResult,看是否是not-enough-free-space-入盘容易(请参阅此答案:)。

Image.Save() 内部调用 GDI 函数 GdipSaveImageToFile() 如果驱动器 space 不足则不会失败。您可以尝试 GetLastError() 来获取最后一个 Win32 错误。

如果 GetLastError() 没有帮助,我想到的唯一解决方案是将图像保存到临时 MemoryStream,然后将生成的流写入文件。

您需要自己处理流:

using (var ms = new MemoryStream(myPictureStream))
 using (Image image = Image.FromStream(ms))
  using(var jpg = new MemoryStream())
   using (var file = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
   {
      image.Save(jpg, ImageFormat.Jpeg);
      jpg.Seek(0, SeekOrigin.Begin);
      jpg.WriteTo(file);
   }