C# 映像上没有引发异常。磁盘上没有可用空间时保存

C# 映像上没有引发异常。磁盘上没有可用空间时保存,c#,image,out-of-memory,system.drawing,C#,Image,Out Of Memory,System.drawing,我将在服务器上保存映像,并介绍磁盘没有可用空间的情况。为了模拟这种情况,我创建了一个几乎没有空间的虚拟硬盘,并试图将图像保存在那里 我希望在尝试保存图像时收到异常,包括: using (var ms = new MemoryStream(myPictureStream)) using (Image image = Image.FromStream(ms)) { image.Save(fileName, ImageFormat.Jpeg); } 但事实并非如此,没有引发异常。相反,会保存

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

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

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
,查看磁盘中的可用空间是否不足easy(请参见此答案:)。

Image.Save()
内部调用一个GDI函数
GdipSaveImageToFile()
,如果驱动器空间不足,该函数不会失败。您可以尝试
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);
   }    

读取引用源时,.save函数有时调用GDI plus来保存图像(有时使用.net文件io)。使用的API中有一条评论说,当保存API时,不会报告磁盘空间不足,也许您可以确定调用/params/的组合。。进行保存调用.net io时需要。谢谢你的密码。我把@Eldar answer标记为一个好的答案,因为它已经给出了使用临时流然后保存到文件中的想法,但是有代码是很好的,有用的答案!