【问题标题】:How to programmatically determine which process created a file in .net?如何以编程方式确定哪个进程在 .net 中创建了文件?
【发布时间】:2016-08-19 16:59:20
【问题描述】:

SO 上有几个线程描述了如何使用 Sysinternals 进程监视器等工具检查哪个应用程序创建了文件。像这样的东西是否可以通过 .net 以编程方式实现?

背景:我的程序必须使用其自动化接口远程控制专有的第三方应用程序,而我需要从该应用程序中获得的功能之一有一个错误,它会在 %TEMP% 中创建一堆临时文件,这些文件被称为tmpXXXX.tmp(与 .net 的 Path.GetTempFileName() 相同)但不会删除它们。这会导致 C 驱动器随着时间的推移变满,最终导致应用程序失败。我已经向制造商提交了一个错误,但我们暂时需要一个临时解决方法,所以我想在%TEMP% 上放置一个FileSystemWatcher 来监视tmp*.tmp,收集这些文件,然后在第三个操作之后-party应用程序完成,删除它们。但这是有风险的,因为另一个应用程序也可能将具有相同文件名模式的文件写入%TEMP%,所以我只想删除由NastyBuggyThirdPartyApplication.exe 创建的文件。

这有可能吗?

【问题讨论】:

  • 我知道你怎么知道哪个文件打开了 - 但如果它现在关闭了......
  • 可能的解决方法:如果您可以在自定义用户帐户下运行程序,那么您只需检查文件的所有者
  • 在包含您正在寻找的信息的文件中没有任何内在的东西。您要么必须在创建文件时“在场”并监控有问题的应用程序,要么必须求助于上述用户帐户等诡计。
  • 查看类似:stackoverflow.com/questions/428774/…,您可以使用进程监视器,为您想要的目录和进程设置过滤器。然后使用命令行导出日志并处理文件列表。

标签: c# .net filesystemwatcher


【解决方案1】:

这种事情是可能的,但可能有点棘手。

  1. 要了解文件的创建者,请查看拥有该文件的用户。因此,您可能需要创建一个特定用户,并且该应用程序将在该特定用户下运行。为此,您需要创建一个小型应用程序,该应用程序将通过模拟另一个用户来启动您的有问题的应用程序,因此在应用程序内完成的任何操作都将在此用户下进行,以便创建文件...

  2. 我不知道如何监控并在创建文件时触发,但没有什么可以阻止您设置一个每五分钟或十分钟唤醒一次的计时器,然后检查目录中是否有任何文件由应用程序用户拥有并关闭,因此将其删除。

  3. 也许如果他们对这个错误修复做出快速反应,那么您的应用程序将不需要很长时间。因此,如果可能的话,另一种解决方案可能只是将 Temp 文件夹更改为另一个具有大量空间的驱动器...

【讨论】:

  • 我目前正在选择选项 3,因为在这个系统上创建另一个用户并不是那么简单。这是一个控制一堆测量设备的系统,需要非常特殊的配置。用户和组由域处理,我不想冒险更改任何内容。但是,我看到了只有这个特殊应用程序使用的文件背后的模式,因为这些文件是它自己的专有格式。所以我只是检查文件是否包含特定位置的特定内容,以便能够判断要删除的内容。
【解决方案2】:

一种解决方案是您使用 FileWatcher 自动删除所有文件,但在删除之前,您应该检查文件当前是否未被锁定或被其他进程使用,例如 Sysinternal Suite 有一个名为 handle.exe 的工具,它可以做这个。从命令行使用它:

handle.exe -a

您可以从 c# 程序中调用它(但可能存在一些性能问题)

所以你要做的就是在创建文件时验证它是否正在使用或锁定(例如你可以使用Is there a way to check if a file is in use?中提供的代码)然后删除它。

大多数情况下,当应用程序使用临时文件时,它会锁定它以防止您担心可能会从其他进程中删除文件。

据我所知,无法确定是哪个进程创建了特定文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    相关资源
    最近更新 更多