文件的创建、打开和关闭操作

1 文件的创建和打开CreateFile

创建或打开文件或 I/O 设备。最常用的 I/O 设备如下:文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、邮槽和管道。该函数返回一个句柄,该句柄可用于根据文件或设备以及指定的标志和属性为各种类型的 I/O 访问文件或设备。

HANDLE CreateFileA(
  LPCSTR                lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);

1.1 参数介绍

(1)lpFileName:要创建或打开的文件或设备的名称。您可以在此名称中使用正斜杠 (/) 或反斜杠 (\)。

(2)dwDesiredAccess:请求的对文件或设备的访问,可以概括为读、写、或两者都不为零)。最常用的值是GENERIC_READ, GENERIC_WRITE或两者(GENERIC_READ | GENERIC_WRITE)。

(3)dwSharedMode:请求的文件或设备的共享模式,可以是读、写、两者、删除、所有这些或无(参考下表)。对属性或扩展属性的访问请求不受此标志的影响。如果此参数为零且CreateFile成功,则在文件或设备的句柄关闭之前,无法共享文件或设备并且无法再次打开该文件或设备。

注意  每个打开的句柄的共享选项一直有效,直到该句柄关闭,无论进程上下文如何。

价值意义

0

0x00000000

如果其他进程请求删除、读取或写入访问权限,则阻止它们打开文件或设备。

FILE_SHARE_DELETE

0x00000004

启用对文件或设备的后续打开操作以请求删除访问权限。

否则,如果其他进程请求删除访问权限,它们将无法打开文件或设备。

如果未指定此标志,但已打开文件或设备进行删除访问,则该功能失败。

注意  删除访问权限允许删除和重命名操作。
 

FILE_SHARE_READ

0x00000001

启用对文件或设备的后续打开操作以请求读取访问。

否则,如果其他进程请求读取访问权限,它们将无法打开文件或设备。

如果未指定此标志,但已打开文件或设备进行读取访问,则该函数失败。

FILE_SHARE_WRITE

0x00000002

启用对文件或设备的后续打开操作以请求写访问。

否则,如果其他进程请求写访问权限,它们将无法打开文件或设备。

如果未指定此标志,但已打开文件或设备进行写访问或具有写访问的文件映射,则该函数失败。

 

(4)lpSecurityAttributes:指向SECURITY_ATTRIBUTES 结构的指针,该结构包含两个单独但相关的数据成员:一个可选的安全描述符,以及一个布尔值,该布尔值确定子进程是否可以继承返回的句柄。此参数可以为NULL

(5)dwCreationDisposition:对存在或不存在的文件或设备采取的操作。对于文件以外的设备,此参数通常设置为OPEN_EXISTING

此参数必须是以下值之一,不能组合:

表 2
价值意义

CREATE_ALWAYS

2

总是创建一个新文件。

如果指定的文件存在且可写,则该函数覆盖该文件,该函数成功,并将最后一个错误代码设置为ERROR_ALREADY_EXISTS (183)。

如果指定的文件不存在并且是有效路径,则创建一个新文件,函数成功,并将最后一个错误代码设置为零。

有关详细信息,请参阅本主题的备注部分。

CREATE_NEW

1

创建一个新文件,仅当它不存在时。

如果指定的文件存在,则函数将失败,并且上一个错误代码将设置为 ERROR_FILE_EXISTS(80)。

如果指定的文件不存在并且是可写位置的有效路径,则会创建一个新文件。

OPEN_ALWAYS

4

总是打开一个文件。

如果指定的文件存在,则函数成功,并且最后一个错误代码设置为 ERROR_ALREADY_EXISTS(183)。

如果指定的文件不存在并且是可写位置的有效路径,则该函数会创建一个文件并将最后一个错误代码设置为零。

OPEN_EXISTING

3

打开文件或设备,仅当它存在时。

如果指定的文件或设备不存在,该函数将失败并且最后一个错误代码设置为 ERROR_FILE_NOT_FOUND (2)。

有关设备的更多信息,请参阅备注部分。

TRUNCATE_EXISTING

5

打开文件并将其截断,以使其大小为零字节(仅存在时)。

如果指定的文件不存在,该函数将失败并且最后一个错误代码被设置为 ERROR_FILE_NOT_FOUND (2)。

调用进程必须打开文件,并将GENERIC_WRITE位设置为dwDesiredAccess参数的一部分。

 

(6)dwFlagsAndAttributes:文件或设备属性和标志,FILE_ATTRIBUTE_NORMAL是文件最常见的默认值。此参数可以包括可用文件属性 ( FILE_ATTRIBUTE_* ) 的任意组合。所有其他文件属性覆盖 FILE_ATTRIBUTE_NORMAL

(7)hTemplateFile:具有GENERIC_READ访问权限的模板文件的有效句柄。模板文件为正在创建的文件提供文件属性和扩展属性。此参数可以为NULL

详细请见:https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea

1.2 返回值

如果函数成功,则返回值是指定文件、设备、命名管道或邮槽的打开句柄。

如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError

1.3 函数应用

#include <windows.h>

using namespace std;

int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	/*
	/	创建和打开文件操作
	*/
	HANDLE hFile = CreateFile("E:\\Project\\07_test\\test.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
		CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
	if(INVALID_HANDLE_VALUE != hFile)
	{
		MessageBox(NULL, "创建文件成功", "Tip", MB_OK);
		CloseHandle(hFile);
	}
	else
	{
		DWORD dwError = GetLastError();
		MessageBox(NULL, "创建文件失败", "Tip", MB_OK);
	}
	return 0;
}

2 关闭文件 CloseHandle 

关闭一个打开的对象句柄。

BOOL CloseHandle(
  HANDLE hObject
);

2.1 参数介绍

(1)hObject:打开对象的有效句柄。

2.2 返回值

如果函数成功,则返回值非零。

如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError

详细请见:https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle

2.3 函数应用

见1.3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值