windows api之文件的创建和打开
CreateFileW/CreateFileA函数
在windows api中可以使用CreateFile来创建文件夹,其中CreateFileW是Unicode编码下的宏函数,CreateFileW是长字节下的宏函数,以下编程环境使用unicode编码,所以使用的是CreateFileW。
我们先来看一下宏函数的原型:
WINBASEAPI
__out
HANDLE
WINAPI
CreateFileW(
__in LPCWSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);
-
lpFileName:必选,被创建文件的名字。一般定义一个数组[MAX-PATH]去存放文件名。MAX_PATH是一个文件名的最大长度。
-
dwDesiredAccess:文件的属性(权限),有以下属性可选:
Constant | Generic meaning |
---|---|
GENERIC_ALL | 获得所有权限 |
GENERIC_EXECUTE | 可执行 |
GENERIC_READ | 可访问 |
GENERIC_WRITE | 可写入 |
- dwShareMode:分享模式。对于请求的设备或者文件,给予它的权限(读写、删除等)有以下属性可选:
Constant | Generic meaning |
---|---|
FILE_SHARE_READ | 访问权限 |
FILE_SHARE_WRITE | 写入权限 |
0 | 不允许其他进程在请求删除、读取或写入访问权限时打开文件或设备 |
FILE_SHARE_DELETE | 打开文件的设备被允许执行文件的删除 |
- lpSecurityAttributes:
一个指向SECURITY_ATTRIBUTES结构体的指针。这个成员可以被设置为NULL,如果该参数为NULL,则CreateFile返回的句柄不能被应用程序创建的任何子进程继承。
SECURITY_ATTRIBUTES结构体如下所示:
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength; //设置为结构体本身的大小
LPVOID lpSecurityDescriptor;
//一个指向SECURITY_DESCRIPTOR结构体的指针
BOOL bInheritHandle;
//指定在创建新进程时是否继承返回的句柄。如果该成员为真,则新进程将继承该句柄。
} SECURITY_ATTRIBUTES;
- dwCreationDisposition:对存在或不存在的文件或设备采取的操作。
Constant | Generic meaning |
---|---|
CREATE_ALWAYS | 总是创建一个文件,并且覆盖以前原有的文件 |
CREATE_NEW | 只有在文件不存在时创建 |
OPEN_ALWAYS | 总是打开一个文件 |
OPEN_EXISTING | 打开一个已存在的文件 |
TRUNCATE_EXISTING | 打开一个已有文件并且删除文件里面的内容 |
- dwFlagsAndAttributes:设置文件或者设备的属性和标志。
Attribute | Meaning |
---|---|
FILE_ATTRIBUTE_NORMAL | 无属性 |
FILE_FLAG_NO_BUFFERING | 文件或者设备打开的时候不使用缓存 |
FILE_FLAG_OPEN_REPARSE_POINT | 当打开一个文件时,会返回一个文件句柄,不管控制重新解析点的过滤器是否工作 |
Tip:重解析可以改变文件系统过滤器对文件的各种操作。
-
hTemplateFile:指向有 GENERIC_READ 访问权限的的模板文件的合柄,模板文件提供文件属性以及额外的属性,可以被设置为NULL;如果打开一个已存在的文件,则 CreateFile 函数忽略这个参数。
-
返回值:调用成功返回指向你指定的文件的句柄;调用失败的话返回INVALID_HANDLE_VALUE。
接着,我们来看一下code,以打开文件为例:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
HANDLE handle= CreateFile(_T("D:\\haohaoxuexi.txt"),GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,TRUNCATE_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //文件有读写属性
if (handle != INVALID_HANDLE_VALUE)
{
MessageBox(NULL, _T("成功!"), _T("Tip"), MB_OK);
CloseHandle(handle);
}
else
{
DWORD dwErr = GetLastError();
MessageBox(NULL, _T("失败!"), _T("Tip"), MB_OK);
}
return 0;
}
需要注意的是,在调用完文件之后,一定要使用CloseHandle()来关闭你打开的文件句柄,释放掉资源。