基本上,我想在实际尝试打开文件之前检查我是否有权打开该文件;除非必须,否则我不想使用 try/catch 进行此检查。是否有我可以事先检查的文件访问属性?
过去我已经做过无数次这样的事了,但几乎每次我的尝试都是错误的。
文件权限(甚至文件存在)是volatile——他们可以随时改变。感谢墨菲定律尤其包括您检查文件和尝试打开文件之间的短暂时间。还有其他原因可能会失败,例如锁定或网络可用性和路径解析。如果您知道自己需要先检查的区域,则更有可能出现错误的结果。但奇怪的是,它永远不会在您的测试或开发环境中发生,因为这些环境往往相当静态。这使得问题很难在以后追踪,并且使得此类错误很容易进入生产。
这意味着,尽管您进行了检查,但如果文件权限或存在问题,您仍然必须准备好处理异常。异常处理代码是required,无论你是否提前检查文件,良好的异常处理程序都可以提供all存在或权限检查的功能。
但是异常处理不是很慢吗?我很高兴你问了。是的。是的。事实上,展开堆栈来处理异常是在单台计算机中可以做的最慢的事情。然而,重要的是要记住磁盘 I/O 甚至更慢 —lot较慢 - 并调用.Exists()
函数或检查权限总是会强制在文件系统上进行额外的 I/O 操作。
因此,我们发现在尝试打开文件之前进行初始检查既多余又浪费。与异常处理相比,没有额外的好处。它实际上会损害而不是帮助你的表现。它增加了必须维护的更多代码的成本。最后,它可能会引入微妙的错误。进行初步检查根本没有任何好处。
相反,这里正确的做法是立即尝试打开文件,而不进行初始检查,并在失败时将精力投入到良好的异常处理程序中。无论您是在检查权限、锁定,甚至只是检查文件是否存在,情况都是如此。
总之:选择是每次使用更多代码为文件检查支付(大量)额外成本,或者仅在某些时间使用更少代码为异常处理支付较小但仍然很糟糕的成本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)