一、原理
在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()
{
// 注意路径前面有一个L
HANDLE 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
版本