【问题标题】:How do I reliably determine if a file is already opened in Microsoft Excel?如何可靠地确定文件是否已在 Microsoft Excel 中打开?
【发布时间】:2012-08-03 21:10:53
【问题描述】:

我正在实现一个 Excel 接口。我正在使用 COM 直接从 C++ 自动化 Excel。我的大部分应用程序都可以可靠地运行。

但是,我无法检测到文件是否已在 Excel 中打开。如果它是打开的,那么我想通知用户在运行模拟之前关闭它。

我没有使用 MFC、VB 或 .NET。我的解决方案必须适用于 Excel 版本 97 到 2010。如果我可以通过编程方式知道 Excel 的版本,则可以对不同的 Excel 版本使用不同的技术。

我在同一文件夹中查找名为“~$xxx”(其中“xxx”是原始文件名)的文件,以确定 Excel 是否创建了会话锁定。但这种技术并不总是有效。

类似的问题是,一旦在我的程序中启动模拟,我想阻止用户以写入模式打开文件(只读模式是可以的)。

【问题讨论】:

  • 您的意思是您希望用户仅在某个特定文件的情况下关闭 excel 中的文件?或任何文件? Excel 是否以独占模式打开文件?可以打开写吗?
  • 我的程序将读取/写入 Excel 文件。我希望 Excel 不会干扰模拟。如果文件已在 Excel 中打开,则用户可以键入/编辑 Excel 文件,然后尝试保存。
  • 您不能尝试打开文件进行写访问吗?如果其他人已经打开它,那应该会失败:同样,如果你成功了,它应该阻止其他人打开它进行写作。
  • @Tim:因为是Excel文件,所以我不自己写(请COM帮我写)。但是,我可以尝试打开文件进行写入,以确定我是否可以继续。感谢您的建议。

标签: c++ excel com automation


【解决方案1】:

我不使用 C++,但使用来自 VB.net 的相同逻辑,这个 C++ 代码可能应该做你想要的?不过,我还没有测试过……这也不需要您检查任何特定的 Excel 版本。对于.xlsx 或任何其他扩展名,只需替换下面的扩展名即可。

std::ofstream ofs("MyFile.xls");

if(ofs.is_open())
{
    //~~> File is ready for output
}
Else
{
    //~~> File is NOT ready for output
}

编辑

你可能也想看看这个?

主题:FileInfo::IsReadOnly 属性

链接http://msdn.microsoft.com/en-us/library/system.io.fileinfo.isreadonly.aspx#Y0

引用以上链接

获取或设置一个确定当前文件是否为只读的值。

命名空间:System.IO

程序集:mscorlib(在 mscorlib.dll 中)

【讨论】:

  • 我接受了您的回答,因为它有效。但是,在我检查它和打开应用程序的 COM 接口之间存在延迟(延迟)。在它们之间,Excel 有可能(尽管极不可能)打开文件。
  • 我在 Java 中已经有了类似的东西。我检查文件是否具有读写访问权限。然后我以 APPEND 模式打开文件进行写入,以免意外破坏原始文件。如果文件可以打开,就可以写入。不过,此解决方案也与您提出的解决方案存在相同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2015-06-24
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多