繁体   English   中英

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

[英]How to detect System.IO.IOException cause by existing file?

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

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

我该怎么办?

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

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

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

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


正如你可能会说的那样,程序逻辑的问题取决于人类可读的消息,这是我的一个宠儿 - 我不会告诉你多久,因为这会让我觉得老。 这让我分心了一些应该是显而易见的事情。

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM