C# 如果磁盘已满,是否会引发IO异常?
当尝试写入文件但磁盘已满时,.NET Framework会引发什么异常C# 如果磁盘已满,是否会引发IO异常?,c#,.net,C#,.net,当尝试写入文件但磁盘已满时,.NET Framework会引发什么异常 Windows缓冲区文件是否写入?您可以在出现问题后检查Win 32异常,查看是否提供了更多详细信息: Win32Exception ex = new Win32Exception(); string low_level_error = ex.Message; 您是如何写入磁盘的?因为它说: “请确保在上调用Dispose方法 所有FileStream对象,尤其是在 磁盘空间有限的环境。 执行IO操作可
Windows缓冲区文件是否写入?您可以在出现问题后检查Win 32异常,查看是否提供了更多详细信息:
Win32Exception ex = new Win32Exception();
string low_level_error = ex.Message;
您是如何写入磁盘的?因为它说:
“请确保在上调用Dispose方法
所有FileStream对象,尤其是在
磁盘空间有限的环境。
执行IO操作可能会引发错误
如果没有磁盘空间,则出现异常
可用,处置方法为
在启动文件流之前未调用
最后定稿。”
您将获得一个IO异常:
System.IO.IOException: There is not enough space on the disk.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
System.IO
库处理读写磁盘的实际任务,并将它们包装在托管代码中,因此您不应该使用它们来获取任何非托管异常
同样值得一试的是(使用他们到处散发的劣质小U盘),看看你的代码会发生什么-这通常是发现这类事情的最好方法。你会得到一个“IOException”。但问题是“IOException”的范围相当广,不仅仅是磁盘已满。我建议还检查内部的“HResult”以精确过滤掉此案例
catch (IOException ioEx)
{
// Is it 'DISK_FULL'?
uint unsignedResult = (uint)ioEx.HResult;
if (unsignedResult.IsOneOf(0x80000027, 0x80000070, 0x80070027, 0x80070070))
{
// Remove the partial file
try
{
File.Delete(pathName);
}
catch { }
// do your special stuff here
}
else
throw;
}
请注意,区域8000中的Win32错误代码在区域8007中镜像,这就是为什么检查中存在几乎重复的错误代码。为什么不试试看-插入U盘并继续向其写入垃圾代码,直到空间耗尽,然后再查看发生了什么。我怀疑在写入时会出现托管的
IOException
,这将使其超出限制,因为缓冲过程对托管代码应该是不透明的。C#是一种编程语言-由于文件系统已满,它什么都不做。您的意思是“是否会抛出.NET中的IO异常…”我还想知道异常何时会抛出的确切答案当您尝试在一个完整的磁盘上执行写入操作(或打开一个文件进行写入,我想)时,将抛出异常。完整磁盘上的读取操作不会引发异常。