当磁盘上没有可用空间时,Image.Save上没有抛出异常

elb*_*ita 4 c# system.drawing image out-of-memory

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

我希望在尝试保存图像时收到异常,但是:

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

但事实并非如此,没有例外.而是保存一个空文件,所以我不知道错误.我想在尝试保存图像时收到一些错误,或者在抛出异常之前能够预测错误.

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

  • 我知道我可以检查驱动器上的可用空间DriveInfo,但是我没有驱动器号来检查生产,所以这个选项被丢弃了.
  • 保存图像后,我尝试检索它Image.FromFile然后OutOfMemoryException抛出,但我知道这可能发生在其他情况下,我不知道这是否是检查磁盘没有可用空间的合法方式.

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

编辑

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

这样做,IOException抛出一个,你可以检查HResult异常,看看它是否是一个不够空闲的磁盘空间(参见这个答案:https://stackoverflow.com/a/ 9294382/4067893).

Eld*_*iev 6

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

如果GetLastError()没有帮助,我脑海中出现的唯一解决方案是将图像保存为时间MemoryStream,然后将结果流写入文件.