调试文件服务器中神秘消失的文件

本文关键字:消失 文件 文件服务器 调试 | 更新日期: 2023-09-27 18:25:13

我们的生产系统最近遇到了一个问题,一些文件正在消失,或者它们的名称发生了更改,从而中断了数据库中对它们的引用。

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

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

如果没有,那么我将非常感谢一些关于如何解决这个问题的提示。

谢谢。

调试文件服务器中神秘消失的文件

这一点对您来说将非常难以捕捉。您有一个FileSystemWatcher,如果文件非常关键,您可以使用它至少捕获并带回文件。但它并没有给你任何关于如何/是什么做出改变的上下文信息,只是改变发生了。

外壳挂钩也是如此,你也不想这样做。(https://msdn.microsoft.com/en-us/library/windows/desktop/cc144063(v=vs.85).aspx)

至于挂钩到所有对File类的调用,如果你有一个包装类的话,这是可能的,但否则会很困难。

试试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.Ion并向该框架添加替代项。