我想创建并打开一个文件,但前提是它不存在。我不想使用File.Exists,因为在创建具有相同名称的文件后,通过切换的线程。
如何检查System.IO.IOException异常是否由文件存在引起?我不想解析错误消息(即使它可以像.indexOf一样简单(“存在”))
我该怎么做?
答案 0 :(得分:6)
如果已经存在,我不确定他是否要打开文件。
我认为他实际上是在FileMode.CreateNew
之后,如果该文件已经存在,则会抛出IOException
,否则将创建并打开它。
答案 1 :(得分:5)
您应该避免根据Exception.Message属性的内容做出逻辑决策。这被定义为人类可读的消息,而不是程序要读取的消息。此类消息如有更改,恕不另行通知。
人类可读的消息经常发生变化,使人们更容易阅读。这不会让你的节目更快乐。
正如你可能会说的那样,程序逻辑的问题取决于人类可读的信息,这是我的一个小小的烦恼 - 我不会告诉你多久,因为这会让我觉得老了。这让我分心了一些应该是显而易见的事情。
请检查文件不存在时是否收到System.IO.FileNotFoundException。尝试捕获它而不是IOException。
答案 2 :(得分:3)
您总是可以从异常捕获块的WITHIN中检查File.Exists()....你之前不想因为线程而检查 - 所以在你已经知道你有问题之后检查。
假设您没有突然从其他线程中删除该文件,这将是一种简单明了的方法。
不要忘记File.Exists本身可能会导致异常,所以一定要再次捕获它。
答案 3 :(得分:3)
这里最好的选择是在打开文件时使用CreateNew选项。
有一种简单的方法可以检查磁盘上是否存在文件。您唯一可以检查的是,该进程至少具有有限访问权限的磁盘上是否存在曾经且可能仍然的文件。
即使您从应用程序中获取对文件的所有访问权限,也无法可靠地阻止某些其他应用程序创建/删除该文件。即使有足够的文件系统级别锁定,用户也可以做一些恶劣的事情,例如从计算机中取出USB密钥。
解决此类问题的最佳方法是使用CreateNew等开放选项。这将允许操作仅在文件在尝试创建的时间点不存在时才成功。您可以在此时捕获异常并尝试推断它是来自现有文件还是其他一些无效访问异常。
像File.Exist这样的方法会给您的代码库带来错误的安全感,并且应该在签入时仔细检查。
答案 4 :(得分:0)
您可以使用File.Open并使用FileMode.OpenOrCreate调用它。
每条评论:好的,FileMode.CreateNew怎么样?然后,如果已经有一个,你会得到一个IOException,否则,换一个新的。