【问题标题】:Debug mysteriously disappearing files from file server调试文件服务器中神秘消失的文件
【发布时间】:2015-11-30 23:40:23
【问题描述】:

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

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

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

如果没有,那么我将不胜感激有关如何解决此问题的一些提示。

谢谢。

【问题讨论】:

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


    【解决方案1】:

    你很难捕捉到这个。您有 FileSystemWatcher,如果它非常重要,您至少可以使用它来捕获并带回文件。但它不会为您提供有关如何/是什么进行更改的任何上下文信息,只是发生了更改。

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

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

    【讨论】:

      【解决方案2】:

      试试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 将替代品添加到该框架。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2011-08-23
        • 2015-05-06
        • 2021-11-09
        • 1970-01-01
        相关资源
        最近更新 更多