确定任何应用程序正在打开/使用非锁定应用程序打开文件的时间?

时间:2016-01-14 12:26:22

标签: c# file locking

我试图找到最通用的方法来了解文件是否正在使用"通过任何申请。

对于像notepad / onenote / notepad ++这样的应用程序也是如此(它不会锁定文件)。

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

我到目前为止所得到的是以下内容:

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

我完全迷失了#34; Notepad ++"应用程序或类似的。 notepad ++对文件或文件夹没有任何锁定,它使用单个进程。 在进行Process.Start时,我甚至不知道如何处理这种情况。我甚至没有这个过程的名称。 (我可以检查注册表,看看谁是打开文件的默认应用程序).​​..

那么,还有其他方向吗?

谢谢!

==编辑==

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

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

1 个答案:

答案 0 :(得分:0)

我猜你正在努力做到这一点,

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();
    }
}

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

据我所知,您可能不知道系统是否已经安装了notepad ++及其路径等。在这种情况下,您可以尝试使用windows附带的notepad.exe路径。

事实上,你所看到的并没有完美的解决方案。换句话说,没有文件查看器/编辑器保证

  1. 使用特定的锁定机制
  2. 保持句柄对包含它的文件或目录开放
  3. 不使用DDE等进行通信
  4. 您可以找到为打开文件而注册的默认应用程序,但您不知道它是作为单个实例还是多实例应用程序启动,还是使用DDE等进行通信