我正在服务器上保存图像,并覆盖磁盘没有可用空间的情况。为了模拟这种情况,我创建了一个几乎没有空间的虚拟硬盘,并尝试在那里保存图像。
当我尝试保存图像时,我原本期望会收到异常:
但事实并非如此,没有异常被抛出。相反,保存了一个空文件,因此我无法意识到错误。 当尝试保存图像时,我希望能收到一些错误或能够预先预测错误而不会抛出异常。
我已经考虑了一些可能的解决方案:
- 我知道可以使用DriveInfo来检查驱动器上的可用空间,但我将没有驱动器号来检查生产环境中的驱动器,因此排除了此选项。 - 在保存图像后,我尝试使用Image.FromFile检索它,然后会引发OutOfMemoryException,但我知道在其他情况下也可能发生这种情况,并且我不确定这是否是检查磁盘没有可用空间的合法方式。
那么...为什么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://dev59.com/0Gox5IYBdhLWcg3wTina#9294382)。