我们最近在我们的制作系统中遇到了一些问题,其中一些文件已经消失,或者名称发生了变化,从而打破了数据库中对它们的引用。
我已经将日志添加到我怀疑可能存在错误的地方,但是代码库很大,并且有很多流程可以删除/复制/移动文件,所以很难找到像这样的问题。
我的问题是,是否有可能以某种方式从.NET扩展File Delete / CopyTo / MoveTo方法以捕获每个文件操作,并将其与StackTrace一起记录,以了解请求的来源?
如果没有,那么我会很感激如何解决这个问题。
谢谢。
答案 0 :(得分:0)
这个对你很难捕捉。您有FileSystemWatcher,您可以使用它至少捕获并返回文件,如果它是关键的。但它并没有为您提供有关如何/如何进行更改的上下文信息,只是发生了更改。
对于shell钩子来说也是如此,你也不想这样做。 (https://msdn.microsoft.com/en-us/library/windows/desktop/cc144063(v=vs.85).aspx)
至于挂钩所有对File类的调用,如果你有一个包装类就可以了,但是否则会很难。
答案 1 :(得分:0)
试试Ionad.Fody。它允许替换整个程序集上的静态方法调用。
PM> Install-Package Ionad.Fody
但它完全取代了方法,因此默认情况下您无法使用原始功能。 要扩展方法,必须在单独的项目/程序集中创建包装器。
例如。在解决方案中添加新项目。不要将Fody.Ionad应用于它。为您需要扩展的所有方法添加包装器:
public static class FileHelper
{
public static void Delete(string path)
{
Console.WriteLine(path);
File.Delete(path);
}
}
将Fody.Ionad应用于您需要替换方法并使用StaticReplacement
属性添加替换项的主项目:
[StaticReplacement(typeof(File))]
public static class FileSubstitute
{
public static void Delete(string path)
{
FileHelper.Delete(path);
}
}
现在,当您致电File.Delete("path")
时,它会输出控制台路径并删除该文件。
如果你使用一些在自己的方法中隐藏File
调用的框架,你必须应用Fody.Ionad也将替换添加到该框架。