在Windows下使用C/C++代码判断文件是否被占用
- 一、原理
- 二、函数简单介绍
- 三、实例代码
一、原理
在Windows
下有一个Windows API
叫做CreateFile
,通过这个接口我们可以创建或打开文件,我们打开文件时可以采用独占模式进行打开,如果能够打开文件说明这个文件没有被其他进程打开,如果打开失败说明该文件已经被其它进程打开了。
将该函数的第三个参数设置为0
就是以独占模式进行打开文件
HANDLE CreateFile([in] LPCSTR lpFileName,[in] DWORD dwDesiredAccess,[in] DWORD dwShareMode,[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,[in] DWORD dwCreationDisposition,[in] DWORD dwFlagsAndAttributes,[in, optional] HANDLE hTemplateFile
);
二、函数简单介绍
参数:
参数名 | 描述 |
---|---|
lpFileName | 要创建或打开的文件的名称。 |
dwDesiredAccess | 以何种方式打开文件, GENERIC_READ 读,GENERIC_WRITE 写, GENERIC_READ | GENERIC_WRITE 读写 |
dwShareMode | 文件的共享模式,0 表示以独占模式打开文件。 |
lpSecurityAttributes | 一个指针,与文件安全有关。一般情况下设置为NULL ,表示此函数返回的句柄不能被子进程继承,并且返回的句柄关联的文件获得默认安全描述符。 |
dwCreationDisposition | 要对存在或不存在的文件执行的操作。一般设置为OPEN_EXISTING ,表示只有存在文件才打开,文件不存在,则该函数将调用失败,记录错误。 |
dwFlagsAndAttributes | 一般情况下直接设置为FILE_ATTRIBUTE_NORMAL 。 |
hTemplateFile | 当创建文件时以什么为模板进行创建文件。一般不使用,我们设置为NULL 。 |
返回值 :
- 如果函数成功,则返回值是指定文件的打开句柄。
- 如果该函数失败,则返回值为
INVALID_HANDLE_VALUE
。
三、实例代码
#include <iostream>
#include <Windows.h>int main()
{// 注意路径前面有一个LHANDLE Handle = CreateFile(L"hello.pptx", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == Handle){std::cout << "文件已经被其他进程占用!" << std::endl;}else{std::cout << "成功以独占模式打开文件!" << std::endl;}// 关闭句柄CloseHandle(Handle);
}
我们先打开hello.pptx
文件,然后运行程序:
然后我们关闭hello.pptx
文件,再次运行程序:
- 这里是MSDN的官方文档:CreateFileA
- 其中
CreateFile
是对CreateFileA
和CreateFileW
的别名,这样就可以根据UNICODE
预处理器常量的定义自动选择此函数的ANSI
或Unicode
版本