5

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

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

我该怎么做?

4

5 回答 5

5

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

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


正如您可能会说的,取决于人类可读消息的程序逻辑问题是我的一个小问题——我不会告诉你多久,因为那会让我觉得自己老了。这让我从本应显而易见的事情上分心。

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

于 2009-07-07T00:21:17.083 回答
5

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

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

于 2009-07-07T00:25:33.697 回答
3

您总是可以从异常捕获块中检查 File.Exists()...。由于线程,您不想在之前检查 - 所以在您已经知道您有问题之后检查。

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

不要忘记 File.Exists 本身可能会导致异常,因此请务必再次捕获它。

于 2009-07-07T00:24:12.467 回答
3

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

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

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

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

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

于 2009-07-07T01:54:05.573 回答
0

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

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

于 2009-07-07T00:19:58.843 回答