在Windows平台的C++开发中,使用CreateFile函数操作文件时,共享模式参数直接决定了文件被打开后的访问权限范围,是实现独占打开文件的核心配置项。独占打开文件指的是当前进程打开文件后,其他进程无法对该文件进行读取、写入或者删除操作,直到当前进程关闭文件句柄。

CreateFile函数基础介绍
CreateFile是Windows系统提供的核心文件操作API,用于创建、打开文件、设备、管道等对象,其函数原型如下:
HANDLE CreateFile( LPCWSTR lpFileName, // 文件路径 DWORD dwDesiredAccess, // 请求的文件访问权限 DWORD dwShareMode, // 共享模式参数,核心配置项 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性 DWORD dwCreationDisposition, // 文件存在/不存在时的操作 DWORD dwFlagsAndAttributes, // 文件属性和标志 HANDLE hTemplateFile // 模板文件句柄 );
其中dwShareMode参数就是控制文件共享模式的关键,它的取值决定了其他进程可以同时对该文件进行的操作类型。
共享模式参数的取值规则
dwShareMode参数可以设置为以下值的组合,每个值代表允许其他进程进行的对应操作:
- 0:不允许任何其他进程对文件进行任何访问,即实现独占打开
- FILE_SHARE_READ:允许其他进程读取该文件
- FILE_SHARE_WRITE:允许其他进程写入该文件
- FILE_SHARE_DELETE:允许其他进程删除该文件
如果要实现独占打开,只需要将dwShareMode设置为0即可,此时其他进程尝试打开该文件时,无论请求什么权限都会失败。
独占打开文件的实战代码示例
下面是一个完整的C++示例,演示如何使用CreateFile独占打开一个文本文件,并进行简单的写入操作,最后关闭句柄释放文件:
#include <windows.h>
#include <iostream>
int main() {
// 要独占打开的文件路径
LPCWSTR filePath = L"./test.txt";
// 调用CreateFile,dwShareMode设为0实现独占打开
HANDLE hFile = CreateFile(
filePath,
GENERIC_WRITE, // 请求写入权限
0, // 共享模式设为0,独占打开
NULL, // 默认安全属性
OPEN_ALWAYS, // 文件不存在则创建,存在则打开
FILE_ATTRIBUTE_NORMAL, // 普通文件属性
NULL // 无模板文件
);
// 判断文件是否打开成功
if (hFile == INVALID_HANDLE_VALUE) {
DWORD errCode = GetLastError();
std::cout << "独占打开文件失败,错误码:" << errCode << std::endl;
return 1;
}
std::cout << "文件独占打开成功,其他进程无法访问该文件" << std::endl;
// 写入测试内容
const char* writeContent = "这是独占打开文件时写入的测试内容";
DWORD bytesWritten = 0;
WriteFile(hFile, writeContent, strlen(writeContent), &bytesWritten, NULL);
// 关闭文件句柄,释放独占
CloseHandle(hFile);
std::cout << "文件句柄已关闭,其他进程现在可以访问该文件" << std::endl;
return 0;
}
常见错误与注意事项
在使用CreateFile实现独占打开时,需要注意以下问题:
- 如果文件已经被其他进程以非独占模式打开,当前进程设置dwShareMode为0时调用CreateFile会失败,错误码通常为32(进程无法访问文件,因为另一个进程正在使用此文件)
- 独占打开文件后,必须在操作完成后及时调用
CloseHandle关闭句柄,否则文件会一直被占用,直到当前进程退出 - dwDesiredAccess参数请求的权限需要和实际操作匹配,比如如果只请求了GENERIC_READ权限,后续尝试写入文件也会失败
验证独占效果的方法
可以在运行上述代码的过程中,尝试用记事本或者其他程序打开test.txt文件,会发现无法打开,提示文件被其他进程占用,这就验证了独占打开的效果。当代码执行到CloseHandle之后,再次尝试打开就可以正常访问了。
CreateFile独占打开文件共享模式参数Windows文件操作C++修改时间:2026-07-20 11:39:22