【问题标题】:How to identify whether folder is opened?如何判断文件夹是否被打开?
【发布时间】:2010-01-22 15:51:48
【问题描述】:

在我的应用程序中,我试图重命名文件夹,但如果在 Windows 资源管理器中打开该文件夹,我会得到一个 IOException。如何识别文件夹是否在 C# 中的 Windows 资源管理器中打开?

【问题讨论】:

  • Windows 资源管理器、cmd、其他文件管理器、shell 打开/保存对话框。除了资源管理器之外,还有更多东西可以保持打开状态。
  • 您想确定 Windows 资源管理器是否已打开,或者只是某个其他进程是否有打开的句柄?你想完成什么?捕获异常是一个很好的迹象,表明其他进程可以处理它,如果这就是您的全部目标的话。
  • @Dathan 捕捉异常是个好主意,但我们有非常大的代码库多线程应用程序。如果我们能确定我们可以访问它的天气,那就太好了。谢谢
  • 但是如果不能保证您在完成检查后仍然可以访问它,那么知道您可以访问它有什么用?
  • @bebop 我同意,但我想要一些针对自动化测试的防御性代码 :)

标签: c# file-io ioexception


【解决方案1】:

捕获 IOException?

正如其他人所说,只要尝试做你想做的事,如果它发生就捕获异常并采取适当的行动,无论你的上下文是什么。

在我看来,你真的没有太多选择,考虑一下:

bool iHaveAccess = CheckAccess(folder);
if (iHaveAccess)
{
    RenameFolder(folder,newFolderName);
}

如果在 CheckAccess 成功和调用 RenameFolder 之间锁定文件夹会发生什么?那该怎么办呢?

【讨论】:

  • 是的,我就是这样做的。无论如何,您可能应该对此进行监控。
【解决方案2】:

确定程序是否以阻止您重命名的方式打开了文件夹是不合理的。因为在您做出决定后,另一个进程可能会立即开始或停止使用该文件夹。相反,只需执行操作并捕获生成的异常。

try {
  Directory.Move("old","new");
  return true;
} catch ( IOException ) {
  return false;
}

【讨论】:

    【解决方案3】:

    经过一番搜索,我找到了this postthis post,它们展示了如何以编程方式确定哪个进程锁定了文件的各种技术。其中之一应该允许您检查资源管理器是否已锁定文件夹。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      相关资源
      最近更新 更多