【问题标题】:C# - How to monitor a process' file read/write operations?C# - 如何监视进程的文件读/写操作?
【发布时间】:2011-11-08 16:08:43
【问题描述】:

我认为这可能是一个常见问题,但很难找到答案。我试过在这里和其他论坛搜索,但没有成功。

我正在编写一个 C#(.net 版本 4)程序来监控进程。它已经在进程启动和停止时引发了一个事件,但我还需要检查这个进程在哪里读取和写入;因为我知道这个进程每次运行都会写入大量数据,所以特别写。我们处理成批的数据,进程写入的路径包含 Batch ID,这是记录进程结果的重要信息。

我查看了 System.Diagnostics.Process.BeginOutputReadLine 方法,但由于文档说必须重定向 StandardOutput,我不确定这是否可以在当前正在运行的进程上完成,或者是否可以影响进程原本打算的写操作。

它是 C# 中的控制台应用程序。如果有人对如何做到这一点有任何想法,将不胜感激。

提前致谢!

【问题讨论】:

  • 查看实用程序 stracelsof
  • 正在写入文件/文件吗?还是到标准输出?

标签: c# file-io monitoring


【解决方案1】:

输出重定向只会帮你解决拦截进程标准输出流的问题。这不会影响程序将使用的其他文件或流的读/写操作。

最简单的方法是避免对这些信息进行逆向工程,并对进程将数据写入的位置施加一些控制(例如,将命令行参数传递给它以指定输出路径,您可以自己监控该输出路径)。

如果由于某种原因无法做到这一点,您可以研究一下这些方法,所有这些方法都非常先进并且存在各种缺点:

  • 使用Detours 启动进程并将对CreateFile 的调用重定向到您定义的函数(例如,您可以调用其他函数来跟踪它使用的文件名,然后调用真正的CreateFile) .请注意,使用 Detours 的许可需要花钱,并且需要您构建一个非托管 DLL 来定义您的替换函数。
  • Microsoft-Windows-Kernel-File 事件跟踪提供程序读取数据。此提供程序跟踪系统上所有内容的所有文件操作。使用这些数据需要对 ETW 有深入的了解,如果您尝试从 C# 中使用它,还需要大量的 P/Invoke 调用。
  • 枚举进程启动后的打开句柄。 previous stackoverflow.com question 有几种可能的解决方案。请注意,这不是万无一失的,因为它只为您提供某个时间点的活动快照(例如,该过程可能会太快地打开和关闭句柄,以至于您无法在调用之间观察它以枚举它们)并且大多数答案都需要调用到未记录的函数中。

【讨论】:

    【解决方案2】:

    我最近遇到了这个实现:DetectOpenFiles 但我没有使用和/或测试它。随意尝试。它似乎为给定的进程 ID 提供打开的文件句柄信息。期待阅读您的体验! ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多