C# 如何检测现有文件导致的System.IO.IOException?

C# 如何检测现有文件导致的System.IO.IOException?,c#,asp.net,exception-handling,ioexception,C#,Asp.net,Exception Handling,Ioexception,我想创建并打开一个文件,但前提是它不存在。我不想使用File.Exists,因为线程在创建同名文件后会被切换 如何检查异常System.IO.IOException是否由现有文件引起?我不希望解析错误消息(即使它可以像.indexOf(“exist”)一样简单) 我应该怎么做?您可以使用File.Open并使用调用它 根据评论:好的,FileMode.CreateNew怎么样?然后,如果已经存在异常,您将得到一个IOException,否则,请创建一个新的。您应该避免根据Exception.Me

我想创建并打开一个文件,但前提是它不存在。我不想使用File.Exists,因为线程在创建同名文件后会被切换

如何检查异常System.IO.IOException是否由现有文件引起?我不希望解析错误消息(即使它可以像.indexOf(“exist”)一样简单)


我应该怎么做?

您可以使用File.Open并使用调用它


根据评论:好的,FileMode.CreateNew怎么样?然后,如果已经存在异常,您将得到一个IOException,否则,请创建一个新的。

您应该避免根据Exception.Message属性的内容做出逻辑决策。它被定义为人类可读的消息,而不是程序可以读取的东西。此类信息如有更改,恕不另行通知

人类可读的消息通常会更改,以使其更易于人类阅读。这不会让你的节目更快乐


正如你可能知道的那样,依赖于人类可读消息的程序逻辑问题是我的一个恼怒——我不会告诉你多长时间,因为那会让我觉得自己老了。这让我分心了一些本该显而易见的事情


当文件不存在时,请检查是否获取了。尝试捕获该文件而不是IOException。

您可以始终检查File.Exists()。。。从异常捕获块中。由于线程问题,您不想在之前进行检查-因此,请在您已经知道有问题之后进行检查

假设您不是突然从另一个线程删除文件,这将是一种简单而明显的方法


不要忘记.Exists文件本身可能会导致异常,因此请确保再次捕获该文件。

如果该文件已经存在,我不确定他是否要打开该文件


我想他实际上是在追求
FileMode.CreateNew
如果文件已经存在,这将抛出一个
IOException
,否则将创建并打开它。

在打开文件进行写入时,您最好的选择是使用CreateNew选项

没有简单可靠的方法来检查磁盘上是否存在文件。您唯一可以检查的是文件是否过去存在,也可能仍然存在于进程至少具有有限访问形式的磁盘上

即使从应用程序中关闭对文件的所有访问权限,也无法可靠地阻止其他应用程序创建/删除该文件。即使有足够的文件系统级锁,用户也可以做一些邪恶的事情,比如从计算机中取出USB密钥

解决此类问题的最佳方法是使用诸如CreateNew之类的开放选项。这将只允许在尝试创建时文件不存在的情况下操作成功。此时可以捕获异常,并尝试推断它是来自现有文件还是其他无效访问异常


像File.Exist这样的方法会给代码库带来错误的安全感,应该在签入时仔细检查

那里不是有比赛条件吗?不应该有他描述的情况,但这就是我在第二段中暗示的。这可能是一个简单的解决他的问题的方法,也可能需要考虑他期望文件的百分比是多少,是否有可能在异常中捕获异常?只需嵌套另一个try/catch块。就像其他类型的控制块一样,比如if或for loop我明白了,你的意思是他不想打开已经存在的文件?他说他想“创建并打开一个文件,但前提是它不存在”。这正是CreateNew所做的。我给了a+1来补偿不公平的-1。@Steven:1不公平。。。JP后来编辑了他的帖子,添加了CreateNew,但最初他只提到了OpenOrCreate;)这正是问题所在。我不知道如何检查。我想我可以用。存在,但那感觉很草率。你没领会我的意思。永远不要检查Message属性。虽然我同意这种观点,但我可以想到例外(没有双关语)。真的吗?什么时候也许这是你的信息属性。否则,你会犯一个错误,这个错误会伤害很多人,只是不经常发生,但总是很难发现和纠正。我似乎还记得从.NET1.1到.NET2.0的转换过程中出现了一些错误的代码——微软已经修复了标点符号,人们的代码因此也出现了错误。当然,微软应该被允许更正标点符号。这完全让本地化放在一边了……”“你没有抓住我的重点。永远不要检查消息属性”文件是一个信号量,为什么会有这么多争用?开发克里斯:不,我只是不想意外地覆盖它,因为有可能我的随机ID生成器(使用类random)由于多核和同步,可能会生成相同的ID请参阅。被接受的答案有一个非常有用的链接。但他担心异常的其他原因,如“拒绝许可”等。问题的关键在于区分异常的不同可能原因。关于
FileStream
构造函数的文档非常强烈地暗示,在这种模式下
IOException
仅当文件已经存在时才会抛出,否则您将得到一个更派生的异常(以及更具体的异常)。因此,异常处理程序必须检查实际的异常类型是否为
IOException