【发布时间】: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@).
【问题讨论】:
-
读取参考源 .save 函数有时会调用 GDI plus 来保存图像(其他时候它使用 .net 文件 io)。使用的 API 中有注释msdn.microsoft.com/en-us/library/windows/desktop/… 说保存 API 时不会报告磁盘空间不足
-
也许您可以计算出调用 .net io 需要哪些调用/参数/.. 的组合。 referencesource.microsoft.com/#System.Drawing/commonui/System/…
标签: c# image out-of-memory system.drawing