从文件服务器

时间:2015-11-30 14:36:14

标签: c# asp.net .net debugging fileserver

我们最近在我们的制作系统中遇到了一些问题,其中一些文件已经消失,或者名称发生了变化,从而打破了数据库中对它们的引用。

我已经将日志添加到我怀疑可能存在错误的地方,但是代码库很大,并且有很多流程可以删除/复制/移动文件,所以很难找到像这样的问题。

我的问题是,是否有可能以某种方式从.NET扩展File Delete / CopyTo / MoveTo方法以捕获每个文件操作,并将其与StackTrace一起记录,以了解请求的来源?

如果没有,那么我会很感激如何解决这个问题。

谢谢。

2 个答案:

答案 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也将替换添加到该框架。