【问题标题】:No exception thrown on Image.Save when no free space on disk当磁盘上没有可用空间时,Image.Save 上不会引发异常
【发布时间】:2016-08-07 15:02:47
【问题描述】:

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

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

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,看看它是否是一个 not-enough-free-space-in-disk easy(见这个答案:@ 987654321@).

【问题讨论】:

标签: c# image out-of-memory system.drawing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您需要自己处理流:

    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);
       }    
    

    【讨论】:

    • 感谢您的代码。我将@Eldar 答案标记为好的答案,因为它已经给出了使用时间流然后保存到文件中的想法,但是有代码,有用的答案很好!
    猜你喜欢
    • 2014-09-27
    • 2020-10-28
    • 2016-10-11
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2017-08-07
    • 2020-10-20
    • 2018-06-18
    相关资源
    最近更新 更多