当磁盘上没有空闲 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);
}
但事实并非如此,没有抛出异常。相反,保存了一个空文件,所以我无法意识到错误。
我希望在尝试保存图像时收到一些错误,或者能够在抛出异常之前预测错误。
我已经考虑了一些可能的解决方案:
- 我知道我可以使用
DriveInfo
检查驱动器上可用的免费 space,但我没有驱动器盘符来检查它,所以这个选项被放弃了。
- 保存图像后,我尝试用
Image.FromFile
检索它然后抛出一个OutOfMemoryException
,但我知道这可能发生在其他场景中,我不确定这是否是检查磁盘是否没有可用 space. 的合法方法
所以...知道为什么 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);
}
我正在服务器上保存图像,我正在处理磁盘没有可用空间的情况 space。为了模拟这一点,我创建了一个几乎没有 space 的虚拟硬盘驱动器,我试图将图像保存在那里。
我原以为在尝试保存图像时会收到异常,其中:
using (var ms = new MemoryStream(myPictureStream))
using (Image image = Image.FromStream(ms))
{
image.Save(fileName, ImageFormat.Jpeg);
}
但事实并非如此,没有抛出异常。相反,保存了一个空文件,所以我无法意识到错误。 我希望在尝试保存图像时收到一些错误,或者能够在抛出异常之前预测错误。
我已经考虑了一些可能的解决方案:
- 我知道我可以使用
DriveInfo
检查驱动器上可用的免费 space,但我没有驱动器盘符来检查它,所以这个选项被放弃了。 - 保存图像后,我尝试用
Image.FromFile
检索它然后抛出一个OutOfMemoryException
,但我知道这可能发生在其他场景中,我不确定这是否是检查磁盘是否没有可用 space. 的合法方法
所以...知道为什么 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);
}