ReadFile 和 补充CreateFile

写CreatFile函数:

CreateFile的涵义是创建File这个内核对象,而不是创建物理磁盘上的“文件”。在Win32 API中有一系列操作内核对象的函数,创建内核对象的函数大多命名为CreateXxxx

CreateFile("test.txt",
			GENERIC_READ,
			FILE_SHARE_READ,
			NULL,
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL,
			NULL)

第一个参数

test.txt要打开的文件的名或设备名。这个字符串的最大长度在ANSI版本中为MAX_PATH,在unicode版本中为32767。

第二个参数

GENERIC_READ指定类型的访问对象。如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息

  • 另外,还可以指定下面的控制标志:

    标准控制权限(16-23位掩码):

    DELETE 删除对象的权限。

    READ_CONTROL 从对象的安全描述符中读取信息的权限,但不包括SACL(系统访问控制列表)中的信息。

    WRITE_DAC 修改对象安全描述符中的DACL(随机访问控制列表)的权限

    WRITE_OWNER 修改对象安全描述符中的属主的权限

    SYNCHRONIZE 同步化使用对象的权限,即可以创建一个线程等待信号量释放(但有些对象不支持这个权限)。

    STANDARD_RIGHTS_REQUIRED 等价于前面四种权限的总合(通常这四种是必须具有的权限)。

    STANDARD_RIGHTS_READ 一般等价于READ_CONTROL

    STANDARD_RIGHTS_WRITE 一般等价于READ_CONTROL

    STANDARD_RIGHTS_EXECUTE 一般等价于READ_CONTROL

    STANDARD_RIGHTS_ALL 等价于前面五种权限的总合。

    特殊控制权限(0-15位掩码):

    SPECIFIC_RIGHTS_ALL

    ACCESS_SYSTEM_SECURITY

    MAXIMUM_ALLOWED

    GENERIC_READ

    GENERIC_WRITE

    GENERIC_EXECUTE

    GENERIC_ALL

    注:实质上是通过ACCESS_MASK结构体的一个双字值来设置标准权限、特殊权限和一般权限的。

第三个参数

FILE_SHARE_READ(共享读操作), 如果是零表示不共享; 如果是FILE_SHARE_DELETE表示随后打开操作对象会成功,但只有删除访问请求的权限;如果是FILE_SHARE_READ随后打开操作对象会成功只有请求读访问的权限;如果是FILE_SHARE_WRITE随后打开操作对象会成功,但只有请求写访问的权限。

第四个参数

lpSecurityAttributesSECURITY_ATTRIBUTES, 指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果操作系统支持的话),一般为null(表示默认的安全属性)

第五个参数

dwCreationDispositionLong下述常数之一:

  • CREATE_NEW创建文件;如文件存在则会出错
    CREATE_ALWAYS创建文件,会改写前一个文件
    OPEN_EXISTING文件必须已经存在。由设备提出要求
    OPEN_ALWAYS如文件不存在则创建它
    TRUNCATE_EXISTING将现有文件缩短为零长度

第六个参数(设定这个文件的属性)

dwFlagsAndAttributesLong一个或多个下述常数

  • FILE_ATTRIBUTE_ARCHIVE标记归档属性
    FILE_ATTRIBUTE_COMPRESSED将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式
    FILE_ATTRIBUTE_NORMAL默认属性
    FILE_ATTRIBUTE_HIDDEN隐藏文件或目录
    FILE_ATTRIBUTE_READONLY文件为只读
    FILE_ATTRIBUTE_SYSTEM文件为系统文件
    FILE_FLAG_WRITE_THROUGH操作系统不得推迟对文件的写操作
    FILE_FLAG_OVERLAPPED允许对文件进行重叠操作
    FILE_FLAG_NO_BUFFERING禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
    FILE_FLAG_RANDOM_ACCESS针对随机访问对文件缓冲进行优化
    FILE_FLAG_SEQUENTIAL_SCAN针对连续访问对文件缓冲进行优化
    FILE_FLAG_DELETE_ON_CLOSE关闭了上一次打开的句柄后,将文件删除。特别适合临时文件

    也可在Windows NT下组合使用下述常数标记:
    SECURITY_ANONYMOUSSECURITY_IDENTIFICATIONSECURITY_IMPERSONATIONSECURITY_DELEGATION
    SECURITY_CONTEXT_TRACKINGSECURITY_EFFECTIVE_ONLY

第七个参数(指定模板)

hTemplateFilehTemplateFile为一个文件或设备句柄,表示按这个参数给出的句柄为模板创建文件(就是将该句柄文件拷贝到lpFileName指定的路径,然后再打开)。它将指定该文件的属性扩展到新创建的文件上面,这个参数可用于将某个新文件的属性设置成与现有文件一样,并且这样会忽略dwAttrsAndFlags。通常这个参数设置为NULL,为空表示不使用模板,一般为空。

返回值

如执行成功,则返回HANDLE文件句柄。如果函数失败,返会值会是 INVALID_HANDLE_VALUEINVALID_HANDLE_VALUE表示出错,会设置GetLastError,更多的错误信息可以调用 GetLastError 来获得。即使函数成功,但若文件存在,且指定了CREATE_ALWAYSOPEN_ALWAYSGetLastError也会设为ERROR_ALREADY_EXISTS

ReadFile函数

ReadFile(hFileRead, buffer, BUF_SIZE, &nIn, NULL)

第一个参数(文件句柄 )

HANDLE hFile, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。

第二个参数(缓冲区)

LPVOID lpBuffer,接收数据的缓冲区。

第三个参数(想读字节数)

DWORD nNumberOfBytesToRead,指定要读取的字节数。

第四个参数(实际所读字节数)

LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。

第五个参数

LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。
FILE_FLAG_OVERLAPPED允许对文件进行重叠操作

返回值

调用成功,返回非0
调用不成功,返回为0

#include<iostream>
#include<windows.h>
#define BUF_SIZE 256

using namespace std;

int main() {
	HANDLE	hFileRead;
	DWORD	nIn;
	char buffer[BUF_SIZE]="";

	hFileRead = CreateFile(L"test.txt",
		GENERIC_READ,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (hFileRead == INVALID_HANDLE_VALUE) {
		printf("Cannot open file. Error : %x/n", GetLastError());
		return -1;
	}

	while (ReadFile(hFileRead, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
	{
		printf("%s/n", buffer);
	}
	CloseHandle(hFileRead);

}

实现截图:

在这里插入图片描述

补充:(特记)

字符数组没有初始化 内存空间里就会有一些奇奇怪怪的东西。
所以记得char buffer[BUF_SIZE]=""
千万别写成char buffer[BUF_SIZE]这样,如果写成这样的话,那么会出现一些 “烫烫烫”的字眼。。。。。我一直以为是乱码问题,一直纠结在改存储格式,结果求助了大佬,才知道是字符数组没初始化。。。

备注:
2021年坚持学写博客第2天(学习两个windows API) 寻梦SS

明日目标:
windows核心编程API函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值