windows api之文件的创建

本文介绍了Windows API中的CreateFileW函数,用于创建和打开文件。详细讲解了函数参数,包括文件名、访问权限、分享模式、句柄继承等,并提供了示例代码,强调了使用完毕后需通过CloseHandle()关闭文件句柄的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:文件的属性(权限),有以下属性可选:

ConstantGeneric meaning
GENERIC_ALL获得所有权限
GENERIC_EXECUTE可执行
GENERIC_READ可访问
GENERIC_WRITE可写入
  • dwShareMode:分享模式。对于请求的设备或者文件,给予它的权限(读写、删除等)有以下属性可选:
ConstantGeneric 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:对存在或不存在的文件或设备采取的操作。
ConstantGeneric meaning
CREATE_ALWAYS总是创建一个文件,并且覆盖以前原有的文件
CREATE_NEW只有在文件不存在时创建
OPEN_ALWAYS总是打开一个文件
OPEN_EXISTING打开一个已存在的文件
TRUNCATE_EXISTING打开一个已有文件并且删除文件里面的内容
  • dwFlagsAndAttributes:设置文件或者设备的属性和标志。
AttributeMeaning
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()来关闭你打开的文件句柄,释放掉资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值