编程语言
首页 > 编程语言> > c# – 当磁盘上没有可用空间时,Image.Save上没有抛出异常

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

作者:互联网

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

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

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

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

我已经考虑过一些可能的解决方

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

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

编辑

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

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

解决方法:

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

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

标签:c,image,out-of-memory,system-drawing
来源: https://codeday.me/bug/20190611/1219942.html