【问题标题】:How do I check if a file is already open?如何检查文件是否已经打开?
【发布时间】:2012-08-30 17:57:16
【问题描述】:
private void btnViewErrorLogFile_Click(object sender, EventArgs e)
{
    errorLogFileProcess = Process.Start(AppVars.ErrorLogFilePath);
}

以上在记事本中打开一个文本文件。它包含我的应用程序的错误日志。

我不想让用户打开多个此文件。所以我不想让他/她再次单击按钮并打开同一文件的另一个窗口。

如何检查此文件是否打开?注意:我不想关闭一个(或所有)notepad.exe 进程,因为用户可能会为我的应用程序文件(打开文件时使用 notepad.exe)以外的其他内容打开一个记事本进程。

那么,我该如何检查我打开的进程是否已经打开?

【问题讨论】:

  • 您要解决什么实际问题?用户是否也打开了旧的日志副本并且对哪个是最新的感到困惑?如果是这样,Notepad++ 和 SciTE 等记事本替代品将拾取修改并重新加载内容。
  • 您为什么不直接使用您的应用程序拥有的窗口,然后在其中放置一个多行文本框。添加保存和复制到剪贴板按钮,您就完成了。
  • "上面在记事本中打开了一个文本文件。"它使用与该文件类型关联的程序打开一个文件。那不一定是记事本。

标签: c# file process


【解决方案1】:

刚刚重新阅读了您的问题。

如果您想强制用户在允许他们再次打开之前关闭活动的记事本(您启动的)实例,请保留 errorLogFileProcess 实例,然后在允许该命令之前重新检查它。

Process errorLogFileProcess;

private void btnViewErrorLogFile_Click(object sender, EventArgs e)
{
    if (errorLogFileProcess != null)
    {
        // Process was launched previously; check if exited.
        if (!errorLogFileProcess.HasExited)
        {
            throw new Exception("Can't launch until first one closed.");
        }
    }

    errorLogFileProcess = Process.Start(AppVars.ErrorLogFilePath);
}

还可以使用errorLogFileProcess.HasExited 状态来禁用按钮,这样就不会引发 Click 事件。

【讨论】:

  • 你应该明确启动记事本。对于可能与相关文件类型相关联的某些其他程序,您的代码将失败。
  • 刚刚复制了 OP 的代码;就我个人而言,我总是确定我要推出的任何东西的完整路径。
  • 我如何将记事本窗口移到前面以便用户可以看到,而不是抛出异常?
  • 该过程将首次启动(因为errorLogFileProcess 将为空),但它会在记事本关闭之前停止。
  • 顺便说一句,您无法使用最新版本的 Windows 轻松控制另一个进程的窗口。微软希望用户能够控制这类事情。
【解决方案2】:

在此处查看如何检查文件是否已打开(通过使用 try、catch 块): Check if a file is open

【讨论】:

  • 测试文件是否被锁定。在记事本中打开文件不会以这种方式锁定文件。
猜你喜欢
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
相关资源
最近更新 更多