C# 确定使用非锁定应用程序打开的文件何时被任何应用程序打开/使用?

C# 确定使用非锁定应用程序打开的文件何时被任何应用程序打开/使用?,c#,file,locking,C#,File,Locking,我试图找到最通用的方法来理解文件是否被任何应用程序“使用” 对于记事本/onenote/notepad++(不锁定文件)等应用程序也是如此 我正在通过我的应用程序(使用Process.Start)打开文件,当用户完成对文件的操作时,我需要删除该文件 到目前为止,我的想法是: “类似MSWord的应用程序”-它经常锁定文件,因此-我知道它当前正在使用-删除将失败 “Notepad/MSPaint-like应用程序”-以不同的过程打开文件,并锁定托管文件夹-我可以检查谁锁定了文件夹,并将PID与打

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

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

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

到目前为止,我的想法是:

  • “类似MSWord的应用程序”-它经常锁定文件,因此-我知道它当前正在使用-删除将失败
  • “Notepad/MSPaint-like应用程序”-以不同的过程打开文件,并锁定托管文件夹-我可以检查谁锁定了文件夹,并将PID与打开文件时收到的PID进行比较
  • 类似于“OneNote”的应用程序—这与我打开文件时一样有问题—我会得到不同的PID(我猜进程会打开,然后它会将文件发送到单个OneNote主进程)。但是-然后我可以按名称而不是PID检查它(不是最好的,但还行)-我发现onenote在目录上也有某种锁定。 这里唯一的问题是,我必须等待进程关闭,然后删除文件
我完全不知道“记事本++”或类似的应用程序。 notepad++对文件或文件夹没有任何锁定,它使用单个进程。 在执行流程时,我不确定如何处理这种情况。首先,我甚至没有流程的名称。(我可以查看注册表,看看谁是打开文件的默认应用程序)

那么,还有其他方向吗

谢谢

==编辑==

嗯,目前我决定采用以下逻辑,除非其中有缺陷:

  • 打开应用程序(Process.Start)时—保存PID和应用程序路径。然后等待1秒钟(或者我会考虑其他事情)-尝试通过PID获取进程-如果它存在,这确实是我想要等待的PID。如果没有,那么我将使用进程路径/名称
  • 检查文件是否由常规锁(由任何应用程序)锁定-如果是,则不要删除该文件
  • 如果文件未锁定,请检查谁在锁定文件夹-然后将其与我的PID进行比较。如果PID不存在(而且确实是我想要等待的PID),那么删除该文件。如果它存在-不要删除该文件
  • 如果在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();
        }
    }
    
    然后当函数返回时,可以删除临时文件

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

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

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

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

    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路径

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

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

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

    可能重复@HimBromBeere No,因为我的问题是托管进程未锁定的文件。为什么要这样做?为什么不把这些文件放在某个临时文件夹中,并在退出或启动时(甚至启动时)尝试清理它呢?文件是否包含敏感信息?用户在编辑另一个应用程序中的文件之前,可能会决定退出您的应用程序。@Sinatr因为当用户通过我的应用程序打开一个文件时,我会从远程下载实际文件,然后为他打开它。几分钟后,如果用户完成了对该文件的操作,我想删除它-这里的限制很好。即使它需要等待主机进程(notepad++)关闭。几分钟后,您确定这是正确的标准吗?我建议你不要删除文件。将它们下载到位置,或者更好地为用户定义位置提供一种方法。仍然不清楚这些文件包含什么样的数据,但我认为这种方法要么过于笼统(阅读-你不能涵盖所有情况,所以甚至不要尝试),要么就是完全错误。为什么要删除文件?可能是@HimBromBeere的重复项否,因为我的问题是托管进程未锁定的文件。为什么要这样做?为什么不把这些文件放在某个临时文件夹中,并在退出或启动时(甚至启动时)尝试清理它呢?文件是否包含敏感信息?用户在编辑另一个应用程序中的文件之前,可能会决定退出您的应用程序。@Sinatr因为当用户通过我的应用程序打开一个文件时,我会从远程下载实际文件,然后为他打开它。几天后