C#学习教程:如何阻止或拦截对Directory.Delete(path,true)的调用数据丢失”的问题。很快就发现错误的分支导致了Directory.Delete(customerRoot,true)代码行。灾难性的行是由普通的GUI开发人员编写的。再多的电线也不会造成这样的灾难。所以我的问题是如何防止这个特定的调用。(DirectoryInfo.Delete()是第二个)。这是我的可能解决方案的优先列表还有其他想法吗?我会提到我们的系统有一个专门的文件/文件夹删除服务(身份验证和日志记录)。要在运行时“拦截”调用,您可以使用FileSystemWatcher类,但它实际上并不能阻止删除,只是让您知道它发生了。防止实际删除要困难得多。Windows不提供Linux的ptrace功能,因此您无法拦截系统调用本身(这里有一篇关于它的文章,但据我所知,可用性差不多)。其他人的建议-设置访问权限和信任级别-可能有效,但当你真的需要删除某些内容时,你也会阻止它工作,而“删除服务”只是.NET方法的包装。另一种选择是使用第3方工具并在编译时检查此问题-这个问题正是您所需要的,包括示例,还有更多工具可以执行此操作(我只使用Resharper,但我想它也可以完成任务)。但是,我认为这不是重点。你的开发人员犯了一个错误,它触及了一些客户数据,没有人对此感到高兴。这并不意味着您需要制定系统范围的规则并强制执行,它确实意味着开发人员应该更好地测试他或她的代码和/或应该使用您提到的删除服务(无论是什么)。无论你多么努力,你都无法阻止人们做傻事。您不想花费时间和金钱围绕Directory.Delete()方法构建防御工事,却发现其他人犯了一个不同的愚蠢错误,而这个特定的事情再也不会成为问题。除非像你这样的问题(滥用Directory.Delete())在你的系统中比平常更有可能发生,所以让它过去并专注于其他事情。您可以修改应用程序以在没有完全信任的情况下运行。配置限制访问物理磁盘的信任级别。查看FileIOPermission。请注意,这可以针对特定位置进行配置,从而为您提供相当多的控制权。好理解需求Update想到这里,我也建议做个“保姆测试”。如果您正在进行任何类型的测试,您可以添加一个测试来查看程序集中的所有类型并检查对任何FileSystem方法的调用。任何此类调用都需要在白名单中,否则测试将失败。我正在从事的项目使用它,它提供了很多价值。更新2关于如何进行此类保姆测试的评论。基本上,您需要使用反射来获取所有方法,然后在IL中查找禁止调用。这听起来比实际要复杂得多。从程序集提取特定IL(.NET中间语言)签名的机制UPDATE3还有另一种更好的方法来执行这种不直接涉及IL的保姆测试。我在我的博客上发布了一篇文章,告诉我如何做到这一点。http://datatoknowledge.com/2012/09/10/nanny-tests/Eric您可以在全局包含的命名空间中包含一个单独的目录类(和DirectoryInfo)——这不会阻止某人使用System.IO.Directory.Delete,但它可能有助于捕获它并关闭它,特别是如果您包含一个相同的虚拟函数,该函数会抛出异常并显示一条消息。以上就是C#学习教程的全部内容:如何防止或拦截对Directory.Delete(path,true)的调用。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处:
