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

时间:2016-08-19 08:44:45

标签: c# .net filesystemwatcher

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

以编程方式实现

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

这有可能吗?

2 个答案:

答案 0 :(得分:0)

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

  1. 要知道谁创建了该文件,请查看拥有该文件的用户。因此,您可能需要创建特定用户,该应用程序将在此特定用户下运行。为此,您需要创建一个小型应用程序,通过冒充其他用户来启动您的错误应用程序,因此在应用程序中完成的任何操作都将在此用户下进行,以便创建文件...

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

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

答案 1 :(得分:0)

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

handle.exe -a

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

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

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

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