如何以编程方式确定哪个进程在 .net 中创建了文件?

How to programmatically determine which process created a file in .net?

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

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

创建的文件

这有可能吗?

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

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

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

  3. 也许如果他们对这个错误修复反应很快,你就不会在很长一段时间内需要你的应用程序。所以另一种解决方案,如果可能的话,可能只是将 Temp 文件夹更改为另一个驱动器,其中有很多 space...

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

handle.exe -a

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

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

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

据我所知,没有确定的方法来确定哪个进程创建了特定文件。