【问题标题】:Under Windows XP, with the C language: Checking if a file is open在 Windows XP 下,使用 C 语言:检查文件是否打开
【发布时间】:2013-03-13 21:07:02
【问题描述】:

在我的应用程序中,用 C 编写,在 Windows-XP 下: 如何检查文件是否已被另一个应用程序打开? 一种选择是重命名文件,并检查它是否被重命名。 另一种选择是打开文件进行附加。 但是这些选项非常耗时。 有没有其他更省时的解决方案?

【问题讨论】:

  • 您无法轻松可靠地检测到文件已被另一个进程打开。原因是操作系统允许以非独占模式打开文件,这意味着多个进程可以同时打开同一个文件,打开成功的事实并不一定意味着它是唯一的打开。最糟糕的是,即使您以某种方式检测到文件已被另一个进程打开(或没有),当您使用该知识时,该文件可能会被该进程关闭(或者它可能会被打开,如果您之前检测到它未打开)。
  • 所以,问题归结为您希望如何使用这些信息,以及使用它是否是解决手头问题的正确方法。

标签: c windows-xp rename file-exists


【解决方案1】:

exclusive mode 中打开一个文件。

HANDLE file = CreateFile(_T("MyFile"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
if (file != INVALID_HANDLE_VALUE)
{
    // file is not used by anyone else
    CloseHandle(file);
}

【讨论】:

  • 我不明白该调用如何以“独占”模式打开文件。事实上,我很确定 GENERIC_READ 意味着 `CreateFile(..., GENERIC_READ,...,OPEN_EXISTING...) 保证如果十几个其他进程使用 FILE_SHARE_READ 访问打开文件,调用将成功。 Source
  • @MikeSherrill'Catcall' 根据 MS Pages,msdn.microsoft.com/en-us/library/windows/desktop/… 使用0 作为文件共享模式意味着独占访问。 __ 一个未共享的打开文件(dwShareMode 设置为零)不能被打开它的应用程序或另一个应用程序再次打开,直到它的句柄被关闭。这也称为独占访问。__
  • 谢谢你,瓦莱里。这正是我所需要的。非常感谢。
【解决方案2】:

Windows API 中不存在用于检查某个函数是否在另一个应用程序中打开的函数。如果它确实存在,它将受到竞争条件的影响。

假设您首先检查了一个文件是否已经打开,然后得到的答案是它当前没有打开。然后你继续打开它,但与此同时其他人已经打开它。那么你的打开尝试失败了。

因此,了解您是否可以打开文件的唯一方法是尝试这样做。如果文件已以阻止您尝试打开它的方式打开,则该尝试将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多