识别使用非锁定应用程序打开的文件何时被任何应用程序打开/使用

本文关键字:应用程序 何时 任何 使用 文件 锁定 识别 | 更新日期: 2023-09-27 18:30:26

我试图找到最通用的方法来了解文件是否被任何应用程序"使用"。

对于记事本/OneNote/Notepad++(不锁定文件)等应用程序也是如此。

我正在通过我的应用程序(使用 Process.Start)处理文件的打开,当用户完成文件处理时,我需要删除该文件。

到目前为止,我设法得出的如下:

  • "MSWord like 应用程序" - 它不断锁定文件,因此 - 我知道它目前正在使用 - 删除将失败。
  • "记事本/MSPaint 类似应用程序" - 以不同的进程打开文件,并锁定托管文件夹 - 我可以检查谁在锁定文件夹,并将 PID 与打开文件时收到的 PID 进行比较
  • "OneNote"之类的应用程序 - 当我打开文件时有问题 - 我得到不同的PID(我猜进程打开,然后将文件发送到单个主onenote进程)。但是 - 然后我可以按名称而不是 PID 检查它(不是最好的,但还可以) - 因为我发现 onenote 在目录上也有某种锁。这里唯一的问题是我必须等到进程关闭,然后删除文件。

我对"记事本++"应用程序或类似的应用程序完全迷失了方向。Notepad++对文件或文件夹没有任何锁,它使用单个进程。我不确定如何处理这种情况,在执行 Process.Start 时,我什至没有进程的名称。(我可以检查注册表,看看谁是打开文件的默认应用程序)...

那么,还有其他方向吗?

谢谢!

== 编辑 ==

好吧,目前我已经决定了以下逻辑,除非它有缺陷:

  1. 打开应用程序 (Process.Start) 时 - 保存 PID 和应用程序路径。 然后等待 1 秒钟(或者我会考虑的其他事情) - 尝试通过 PID 获取进程 - 如果存在,这确实是我想等待的 PID。 如果没有,那么我将按进程路径/名称
  2. 检查文件是否被常规锁定(由任何应用程序)锁定 - 如果是,则不要删除该文件。
  3. 如果文件未锁定,请检查谁锁定了文件夹 - 然后将其与我拥有的 PID 进行比较。 如果 PID 不存在(它确实是我想等待的 PID) - 然后删除该文件。 如果存在 - 不要删除该文件。
  4. 如果在 1 秒后启动进程时 PID 不存在,并且文件夹/文件没有锁定 - 我会等到进程结束

这就是我认为的想法

识别使用非锁定应用程序打开的文件何时被任何应用程序打开/使用

我猜你正在尝试这样做,

static void ShowFile(string fileToShow) {
    using (Process proc = new Process()) {
        ProcessStartInfo psi = new ProcessStartInfo(fileToShow);
        psi.UseShellExecute = true;
        proc.StartInfo = psi;
        proc.Start();
        proc.WaitForExit();
    }
}

但是,也许你应该这样做

static void ShowFile(string fileToShow) {
    using (Process proc = new Process()) {
        ProcessStartInfo psi = new ProcessStartInfo(@"C:'Program Files (x86)'Notepad++'notepad++.exe", "-multiInst " + fileToShow);
        psi.UseShellExecute = false;
        proc.StartInfo = psi;
        proc.Start();
        proc.WaitForExit();
    }
}

然后,当您的函数返回时,您可以删除您的临时文件。

我知道您可能不知道系统是否已经安装了记事本++及其路径等。在这种情况下,您可以尝试使用记事本的路径.exe该路径随窗口一起提供。

问题是,对于您正在寻找的东西,没有完美的解决方案。换句话说,没有文件查看器/编辑器可以保证

  1. 使用特定的锁定机制
  2. 使句柄对包含它的文件或目录保持打开状态
  3. 不使用 DDE 等进行通信

您可以找到注册用于打开文件的默认应用程序,但您不知道它是作为单个实例还是多实例应用程序启动,或者它们使用 DDE 等进行通信