【问题标题】:Identify when file opened using non-locking app is being opened/used by any application?确定使用非锁定应用程序打开的文件何时被任何应用程序打开/使用?
【发布时间】:2016-04-19 18:42:17
【问题描述】:

我正在尝试找到最通用的方法来了解文件是否被任何应用程序“使用”。

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

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

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

  • “类似 MSWord 的应用程序” - 一直锁定文件,因此 - 我知道它当前正在使用 - 删除将失败。
  • “类似记事本/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 不存在,并且文件夹/文件没有锁定 - 我将等到进程结束

这就是我的想法

【问题讨论】:

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

标签: c# file locking


【解决方案1】:

我猜你正在尝试这样做,

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 等进行通信

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

【讨论】:

  • 好吧,notepad++ 只是一个例子,我理解你的说法,没有完美的解决方案。但是对于很多情况都有一个解决方案,例如 - 如果我进行的所有测试都失败了,那么我将依赖进程名称.. 但想知道是否有一些我没有考虑过的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2018-02-20
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多