最近我正在调试一个“poof-all-customer-data-is-gone”问题.它没有花太多时间来弄清楚错误的分支导致了Directory.Delete(customerRoot,true)代码行.灾难性的一行是由一个常规的GUI开发人员编写的.没有多少线可以导致这样的灾难.所以我的问题是如何防止这个特定的电话. (DirectoryInfo.Delete()是第二个).
这是我可能的解决方案的优先列表
>编译错误,没有第三方改变构建过程
>没有第三方的运行时拦截
>与第三方进行运行时拦截(不改变构建过程)
>第三方编译错误(我猜PostSharp会这样做)
> GUI开发人员关于客户如何喜欢他们的数据的教育研讨会
还有其他想法吗?
我会提到我们的系统有一个专门的服务(验证和记录)文件/文件夹删除.
最佳答案 要在运行时“拦截”调用,您可以使用
FileSystemWatcher类,但它实际上不会阻止删除,只是让您知道它发生了.防止实际删除要困难得多. Windows不提供Linux的ptrace功能,因此您无法拦截系统调用本身(有一篇关于
here的文章,但可用性相当于我能说的内容).其他人建议的 – 设置访问权限和信任级别 – 可能会有效,但是当您确实需要删除某些内容并且“删除服务”只是.NET方法的包装时,您也会阻止它工作.
另一种选择是使用第三方工具并在编译时检查它 – this question正是您需要的,包括示例,并且还有更多工具可以做到这一点(我只使用Resharper,但我会想象它也可以完成任务).
但是,我不认为这就是重点.你的开发者犯了一个错误,它破坏了一些客户数据,没有人对此感到高兴.它并不意味着您需要制定系统范围的规则并执行该规则,这意味着开发人员应该更好地测试他或她的代码和/或应该使用您提到的删除服务(无论是什么).无论你怎么努力,你都无法阻止人们做蠢事.你不想花时间和金钱围绕Directory.Delete()方法制造防御工事只是为了发现别人犯了一个不同的愚蠢错误,这个特殊的东西再也不会成为问题了.除非像你这样的问题(滥用Directory.Delete())在你的系统中比平常更容易发生,所以放手吧,专注于其他事情.