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

我想创建并打开一个文件,但前提是它不存在。 我不想使用File.Exists,因为一个线程在创建一个具有相同名称的文件后通过切换。

我如何检查exceptionSystem.IO.IOException是否由文件存在引起? 我不想解析错误消息(即使它可以像.indexOf一样简单(“存在”))

我该怎么做?

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

人类可读的消息通常会发生变化,使其对人类更具可读性。 这不会让你的程序更快乐。


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

请检查当文件不存在时是否收到System.IO.FileNotFoundException 。 尝试捕获它而不是IOException。

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

我认为他实际上是在FileMode.CreateNew之后,如果文件已经存在,这将抛出IOException ,否则将创建并打开它。

你总是可以从exceptioncatch块的WITHIN中检查File.Exists()…. 您之前不想检查因为线程 – 所以在您已经知道有问题之后检查。

假设您没有突然从另一个线程中删除该文件,这将是一种简单明了的方法。

不要忘记File.Exists本身可能会导致exception,所以一定要再次捕获它。

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

有一种简单的方法可以检查磁盘上是否存在文件。 您唯一可以检查的是文件是否曾经存在并且可能仍然存在于磁盘上,该进程至少具有有限的访问权限。

即使您从应用程序中获取对文件的所有访问权限,也无法可靠地阻止某些其他应用程序创建/删除该文件。 即使有足够的文件系统级别锁定,用户也可以做出各种各样的事情,例如从计算机中取出USB密钥。

解决此类问题的最佳方法是使用CreateNew等开放选项。 这将允许操作仅在文件在尝试创建的时间点不存在时才成功。 您可以在此时捕获exception,并尝试推断它是来自现有文件还是其他一些无效访问exception。

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

您可以使用File.Open并使用FileMode.OpenOrCreate调用它。

每条评论:好的,FileMode.CreateNew怎么样? 然后,如果已经有一个,你将得到一个IOException,否则,创建一个新的。