在Windows XP操作系统下,使用C语言:如何检查一个文件是否已经打开。

4

在我的应用程序中,使用C语言编写,在Windows-XP下: 如何检查文件是否已被其他应用程序打开? 一种选择是重命名文件,并检查它是否重命名。 另一种选择是以附加方式打开文件。 但这些选项非常耗时。 是否有其他不那么耗时的解决方案来解决这个问题?


3
很难可靠地检测到文件是否被另一个进程打开。原因是操作系统允许以非独占模式打开文件,这意味着多个进程可以同时打开同一个文件,仅仅打开成功并不一定意味着它是唯一打开的。最糟糕的是,即使您某种方式检测到文件已被其他进程打开(或未被打开),在您利用该知识之前,该进程可能会关闭该文件(或者如果您先前检测到它未打开,则可能会打开)。 - Alexey Frunze
所以,问题归结为您想如何使用这些信息,以及使用它是否是解决手头问题的正确方案。 - Alexey Frunze
2个回答

3
没有在Windows API中存在检查函数是否在其他应用程序中打开的功能。如果存在这样的功能,它将受到竞态条件的影响。
假设您首先检查文件是否已经打开,并且答案是它当前没有打开。然后您继续打开它,但同时其他人也在打开它。那么你的尝试将失败。
因此,唯一确定能否打开文件的方法是尝试打开它。如果文件以防止您尝试打开的方式被打开,则该尝试将失败。

2

以独占模式打开文件

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访问模式打开了该文件。来源 - Mike Sherrill 'Cat Recall'
根据MS页面http://msdn.microsoft.com/en-us/library/windows/desktop/aa363874%28v=vs.85%29.aspx,使用`0`作为文件共享模式意味着独占访问。 未共享的已打开文件(dwShareMode设为零)无法被应用程序重新打开,也无法被其他应用程序打开,直到其句柄被关闭。这也被称为独占访问。 - Valeri Atamaniouk
谢谢你,瓦莱里。这正是我所需要的。非常感激。 - Nir S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接