【发布时间】:2015-06-30 12:05:57
【问题描述】:
我正在使用以下代码来检查文件是否正在被另一个应用程序使用:
HANDLE fh = CreateFile("D:\\1.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (fh == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "The file is in use", "Error", 0);
}
如果文件正被其他应用程序使用,则会显示消息框。但是,如果文件不存在,也会显示消息框!
那么我应该怎么做才能解决这个问题,我应该也检查文件是否存在(使用另一个函数),还是可以将CreateFile()的参数更改为仅在文件正在使用时返回INVALID_HANDLE_VALUE并且存在吗?
【问题讨论】:
-
我认为方法是错误的,我不知道如何编写代码来解决它。但我几乎可以肯定文件上一定有某种锁,因此在尝试打开文件时需要检查锁而不是检查失败。另一方面,如果文件由于锁定而无法打开,那么您必须通过某种系统错误代码检查原因,也许是
errno变量,但我不知道 WinAPI。 -
CreateFile失败的原因有很多;因为文件不存在而失败应该不足为奇。您的方法存在根本缺陷。 -
如果你打算以这种方式使用
CreateFile(),至少要正确使用它。您需要请求对文件的独占访问权限,而不是只读访问权限(其他进程可能允许对其文件进行读取访问),然后如果失败,您需要使用GetLastError()区分ERROR_SHARING_VIOLATION(正在使用的文件)与ERROR_FILE_NOT_FOUND等。 -
@Remy: 因为
dwShareMode为零,该代码确实请求独占访问,不是吗? (文档没有说明共享模式受请求访问的影响。) -
@HarryJohnston:很好,我看错了参数。是的,代码已经在请求对文件的独占访问权限。但是,我关于需要使用
GetLastError()来区分不同错误情况的评论仍然有效。