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

本文关键字:net 创建 文件 进程 编程 方式确 | 更新日期: 2023-09-27 18:03:09

在SO上有几个线程描述如何使用Sysinternals进程监视器等工具检查哪个应用程序创建了一个文件。像这样的东西可能从。net编程吗?

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

这有可能吗?

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

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

  1. 要知道谁创建了该文件,请查看拥有该文件的用户。因此,您可能需要创建一个特定的用户,并且该应用程序将在该特定用户下运行。为了做到这一点,你需要创建一个小的应用程序,它将通过冒充另一个用户来启动你的有问题的应用程序,所以应用程序中的任何操作都将在这个用户下进行,所以文件创建…

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

  3. 也许如果他们对这个bug的修复反应很快,你就不需要你的应用很长时间了。所以另一个解决方案,如果可能的话,可能只是把临时文件夹更改到另一个驱动器,它有很多空间…

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

handle.exe -a

你可以从c#程序中调用它(尽管可能会有一些性能问题)

所以你要做的是,当一个文件被创建时,你要验证它是在使用中还是被锁定(例如,你可以使用提供的代码有一种方法来检查一个文件是否在使用中?),然后删除它。

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

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