C# 确定使用非锁定应用程序打开的文件何时被任何应用程序打开/使用?
我试图找到最通用的方法来理解文件是否被任何应用程序“使用” 对于记事本/onenote/notepad++(不锁定文件)等应用程序也是如此 我正在通过我的应用程序(使用Process.Start)打开文件,当用户完成对文件的操作时,我需要删除该文件 到目前为止,我的想法是:C# 确定使用非锁定应用程序打开的文件何时被任何应用程序打开/使用?,c#,file,locking,C#,File,Locking,我试图找到最通用的方法来理解文件是否被任何应用程序“使用” 对于记事本/onenote/notepad++(不锁定文件)等应用程序也是如此 我正在通过我的应用程序(使用Process.Start)打开文件,当用户完成对文件的操作时,我需要删除该文件 到目前为止,我的想法是: “类似MSWord的应用程序”-它经常锁定文件,因此-我知道它当前正在使用-删除将失败 “Notepad/MSPaint-like应用程序”-以不同的过程打开文件,并锁定托管文件夹-我可以检查谁锁定了文件夹,并将PID与打
- “类似MSWord的应用程序”-它经常锁定文件,因此-我知道它当前正在使用-删除将失败
- “Notepad/MSPaint-like应用程序”-以不同的过程打开文件,并锁定托管文件夹-我可以检查谁锁定了文件夹,并将PID与打开文件时收到的PID进行比较
- 类似于“OneNote”的应用程序—这与我打开文件时一样有问题—我会得到不同的PID(我猜进程会打开,然后它会将文件发送到单个OneNote主进程)。但是-然后我可以按名称而不是PID检查它(不是最好的,但还行)-我发现onenote在目录上也有某种锁定。 这里唯一的问题是,我必须等待进程关闭,然后删除文件
这就是我想的想法我猜你是想这么做
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进行通信,等等我猜您正在尝试这样做
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进行通信,等等可能重复@HimBromBeere No,因为我的问题是托管进程未锁定的文件。为什么要这样做?为什么不把这些文件放在某个临时文件夹中,并在退出或启动时(甚至启动时)尝试清理它呢?文件是否包含敏感信息?用户在编辑另一个应用程序中的文件之前,可能会决定退出您的应用程序。@Sinatr因为当用户通过我的应用程序打开一个文件时,我会从远程下载实际文件,然后为他打开它。几分钟后,如果用户完成了对该文件的操作,我想删除它-这里的限制很好。即使它需要等待主机进程(notepad++)关闭。几分钟后,您确定这是正确的标准吗?我建议你不要删除文件。将它们下载到位置,或者更好地为用户定义位置提供一种方法。仍然不清楚这些文件包含什么样的数据,但我认为这种方法要么过于笼统(阅读-你不能涵盖所有情况,所以甚至不要尝试),要么就是完全错误。为什么要删除文件?可能是@HimBromBeere的重复项否,因为我的问题是托管进程未锁定的文件。为什么要这样做?为什么不把这些文件放在某个临时文件夹中,并在退出或启动时(甚至启动时)尝试清理它呢?文件是否包含敏感信息?用户在编辑另一个应用程序中的文件之前,可能会决定退出您的应用程序。@Sinatr因为当用户通过我的应用程序打开一个文件时,我会从远程下载实际文件,然后为他打开它。几天后