【问题标题】:How to find out if a pdf file is "blocked" by a pdf-reader如何找出pdf文件是否被pdf阅读器“阻止”
【发布时间】:2016-08-18 01:44:55
【问题描述】:

在我们的应用程序中,您可以将 - 例如 - 一个 pdf 文件导入应用程序区域。在您定义pdf文件路径的弹出窗口中,您可以指定在成功导入后是否应删除原始文件。

有时用户会导入一个 pdf 文件,他也在 pdf 阅读器(在我们的例子中是 pdf xchange 查看器和 foxit 阅读器)中“打开”了该文件。在这种情况下,我们的应用程序无法删除 pdf 文件,因为它被阻止了。

我怎样才能找到 - 例如 winapi 调用? (不尝试删除或重命名)pdf被pdf阅读器阻止?

提前感谢

【问题讨论】:

  • “我怎样才能知道 pdf 被 pdf 阅读器阻止了?” - 通过尝试删除它。
  • 你在使用DeleteFile函数吗?
  • 你永远不想在做之前就知道你是否可以做一些涉及外部世界的事情,因为你很有可能在检查后被抢先。如果当你再次开始跑步时,情况发生了变化,那就太晚了,你仍然会表现得像以前一样。这被称为“检查时间到使用时间”的错误,尽管在这种情况下它相对无害,但它可以应用于其他地方并成为严重的安全漏洞。

标签: c winapi pdf-reader


【解决方案1】:

虽然干扰其他程序不好(只是告诉你的用户文件正在被使用),但释放文件锁有点困难。

  • 首先,您需要使用ZwQuerySystemInformation 获取系统范围的文件句柄表(并且您的程序需要SeDebug 权限)并找到正在使用的文件。

    • 使用DUPLICATE_CLOSE_SOURCE 标志DuplicateHandle 复制和关闭文件句柄。

    • 或者,进入内核并使用ZwClose 或 ObDereference 函数关闭文件。

不过,在外部关闭文件可能会使远程程序崩溃,这违反了 Windows 的设计原则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多