【发布时间】:2016-04-19 18:42:17
【问题描述】:
我正在尝试找到最通用的方法来了解文件是否被任何应用程序“使用”。
对于像记事本/onenote/notepad++(不锁定文件)这样的应用程序也是如此。
我正在通过我的应用程序(使用 Process.Start)处理文件的打开,并且我需要在用户完成处理后删除文件。
到目前为止,我设法想到的是:
- “类似 MSWord 的应用程序” - 一直锁定文件,因此 - 我知道它当前正在使用 - 删除将失败。
- “类似记事本/MSPaint 的应用程序” - 在不同进程中打开文件,并锁定托管文件夹 - 我可以检查谁在锁定文件夹,并将 PID 与打开文件时收到的 PID 进行比较
- “OneNote”之类的应用程序 - 当我打开文件时会出现问题 - 我得到不同的 PID(我猜该进程打开,然后它将文件发送到单个主 onenote 进程)。但是 - 然后我可以通过名称而不是 PID 检查它(不是最好的,但没问题) - 因为我发现 onenote 在目录上也有某种锁定。 这里唯一的问题是我必须等到进程关闭,然后删除文件。
我完全迷失了“记事本++”应用程序或类似的应用程序。 notepad++ 对文件或文件夹没有任何锁定,它使用单个进程。 我不确定如何处理这种情况,在执行 Process.Start 时,我什至没有进程的名称。 (我可以检查注册表,看看谁是打开文件的默认应用程序)...
那么,还有其他方向吗?
谢谢!
== 编辑 ==
嗯,目前我已经决定了以下逻辑,除非它有缺陷:
- 打开应用程序时 (Process.Start) - 保存 PID 和应用程序路径。然后等待 1 秒(或其他我会考虑的东西) - 尝试通过 PID 获取进程 - 如果它存在,这确实是我想要等待的 PID。如果没有,那么我将按进程路径/名称进行
- 检查文件是否被常规锁(任何应用程序)锁定 - 如果是,则不要删除文件。
- 如果文件未锁定,请检查谁在锁定文件夹 - 然后将其与我拥有的 PID 进行比较。如果 PID 不存在(而且它确实是我想要等待的 PID) - 然后删除该文件。如果存在 - 不要删除该文件。
- 如果在 1 秒后启动进程时 PID 不存在,并且文件夹/文件没有锁定 - 我将等到进程结束
这就是我的想法
【问题讨论】:
-
@HimBromBeere 不,因为我的问题是托管进程未锁定的文件。
-
你为什么要这样做?为什么不将这些文件放在某个临时文件夹中并在退出或启动时尝试清理它(甚至windows start)?文件是否包含敏感信息或什么?用户可能会在完成另一个应用程序中的文件编辑之前决定退出您的应用程序。
-
@Sinatr 因为当用户通过我的应用程序打开文件时,我从远程位置下载实际文件,然后为他打开它。几分钟后,如果用户使用完该文件,我想删除该文件 - 此处的限制很好。即使它需要等到托管进程(notepad++)关闭。
-
那个标准几分钟后,你确定它是正确的吗?我建议你不要删除文件。将它们下载到temp 位置,或者更好地为用户提供定义位置的方法。仍然不清楚这些文件包含什么样的数据,但我认为这种方法要么过于笼统(阅读 - 你不能涵盖所有情况,所以甚至不要尝试)或根本错误。为什么要删除文件?