有没有办法在 Windows 执行删除之前检测文件的删除?我找到了 FileSystemWatcher 类,但仅在执行删除操作后才引发事件,但我想在用户/进程选择删除它时捕获删除操作。您可以监视文件系统表,但要寻找更好的方法。谢谢你的帮助。
3 回答
您需要一个文件系统过滤器驱动程序。但是我强烈建议,如果您不知道答案,您可能不应该这样做。
http://msdn.microsoft.com/en-us/library/windows/hardware/gg462968.aspx
我认为最简单的方法是使用挂钩来获得通知(并最终停止)该过程。它不能在 .NET 中完成,因此您必须DllImport
使用大量结构和少量函数来 P/Invoke。
NtSetFileInformation
让我们从(未记录的)函数开始你的工作。当需要删除文件(使用FileDispositionInformation
结构)时,它是由其他任何东西调用的函数。
现在的问题是如何挂钩该函数(祝你好运,这并不容易)。一个不错的选择是使用Microsoft Detours。看看这篇文章的例子。它的问题是它不是免费的。另一种解决方案(价格合理并带有 .NET 界面)是Deviare,但我什至从未尝试过他们的免费版本,所以我不知道它有多好。如果其他人知道一个好的拦截工具......
或者可以尝试ICopyHook接口。
http://msdn.microsoft.com/en-us/library/windows/desktop/bb776049%28v=vs.85%29.aspx
在CopyCallback方法中,使用wFunc 参数中的FO_DELETE来指定删除操作。
缺点: 仅防止在 Windows Shell 中删除。