在 C# 中为 FileStream 构造函数引发异常,其中 CreateNew 用于现有文件
Posted
技术标签:
【中文标题】在 C# 中为 FileStream 构造函数引发异常,其中 CreateNew 用于现有文件【英文标题】:Exception Thrown in C# for FileStream Constructor with CreateNew for Existing File 【发布时间】:2012-03-02 11:53:53 【问题描述】:我正在用 C#(.NET Web 服务)创建一个文件,并且不想覆盖现有文件。
方法似乎是构造一个带有 FileMode.CreateNew 集的 FileStream。如果文件存在,它实际上会抛出异常。
但是,与文件创建引发的其他可能异常相比,我如何识别此异常? http://msdn.microsoft.com/en-us/library/47ek66wy.aspx 的文档将这种情况列为“IOException”,这显然是含糊的,因为其他事情可能会导致这种情况。
这里的答案是我捕获 IOException 然后只执行 File.Exists 吗?
【问题讨论】:
您可以使用异常中的错误代码。请参阅How do I determine the HResult for a System.IO.IOException? 文件存在,它将是 0x80070050。 @DmitryShkuropatsky:你可能应该这样回答 【参考方案1】:我会推荐另一种方式:首先执行 File.Exist,然后捕获异常。这样您就可以确定文件已经存在这一事实不会引发异常。
【讨论】:
这并不完全正确。从技术上讲,它可以在检查和异常处理之间创建(很少见但仍然可能) 嗯,你是对的。从技术上讲,服务可以更改 InstanceContextMode.Single,而且他没有说明服务之外的文件会发生什么。【参考方案2】:我认为 File.Exists 方法是最优雅的。您可以通过反思来尝试猜测根本原因,但这不值得。 InnerException 可能被设置为更独特的东西。是空的吗?
Message 属性应该描述(用英语或您使用的任何语言)究竟发生了什么。依赖 Message 返回的字符串也不是一个好主意。
说实话,我最喜欢你的想法。
【讨论】:
【参考方案3】:我相信最好的方法是在尝试创建 FileStream 之前使用File.Exists
。示例:
if (File.Exists(path))
//Handle existing file
else
FileStream newFile = new FileStream(path, FileMode.CreateNew);
//Logic to do with your new file
试图解析 IOException 以确保它完全是“正确的” IOException 是脆弱的。我认为唯一的方法是比较 IOException 的注释或描述。
【讨论】:
这令人失望。我不想使用 File.Exists 方法,因为我不想在检查和创建之间留下一个窗口。脆弱正是我问的原因:我知道检查消息字段不是正确的答案。 嗯,我明白你的担心了。我不知道如何确保检查文件和创建文件之间没有间隙。尽管它看起来很脆弱,但我不相信来自 CreateNew 的异常消息可能会改变。如果您绝对不需要间隙,我只会比较消息,但请确保您将其记录好。请注意,不建议将捕获异常作为常规执行的一部分。因此,我建议执行 File.Exists 和 try-catch 检查 IOException 的消息。这样,在 99% 的情况下,File.Exists 会充分通知您。【参考方案4】:您可以从异常中获取错误代码,如下所示:
int hr = Marshal.GetHRForException( ex );
如果文件存在,它将是 0x80070050。
【讨论】:
我曾希望得到一个更清晰的答案,但没想到现实是这样的。这似乎是正确的方法,也是我将采取的方法。谢谢,德米特里。以上是关于在 C# 中为 FileStream 构造函数引发异常,其中 CreateNew 用于现有文件的主要内容,如果未能解决你的问题,请参考以下文章