C++ CreateFile,WriteFile,ReadFile,SetFilePointerEx,DeviceIOControl

本文介绍了C++中使用CreateFile创建或打开文件,ReadFile和WriteFile进行读写操作,以及如何通过SetFilePointerEx设置文件指针。详细讲解了各个函数的原型、作用及使用示例,并提到了DeviceIOControl接口在设备控制中的应用。

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

1. 文件指针

我们大概已经知道该如何创建或者打开一个文件,用CreateFile函数可以轻松做到,还不了解的小伙伴,请穿越到http://www.cnblogs.com/bigsponge/articles/4936599.html
CreateFile函数会使系统创建一个文件内核对象来管理对文件的操作。在这个内核对象内部有一个文件指针,这是我们今天的主角。
文件指针究竟是什么?
文件指针是一个64位的偏移量,指向文件起始位置的相对的位置,假设文件起始位置的地址为xxxx,文件指针为10,那么指针实际指向的地址是xxxx+10。
文件指针的作用是什么?
当我们要调用ReadFile或WriteFile函数对文件进行读和写操作的时候,读取和写入的起始位置永远在文件指针指向的位置。我们来看看ReadFile函数和WriteFile函数的原型:

ReadFile函数原型:

BOOL ReadFile(
        HANDLE    hFile,
        PVOID    pvBuffer,
        DWORD    nNumBytesToRead,
        PDWORD    pdwNumBytes,
        OVERLAPPED*    pOverlapped);

WriteFile函数原型:

BOOL WriteFile(
        HANDLE    hFile,
        CONST VOID    *pvBuffer,
        DWORD    nNumBytesToWrite,
        PDWORD    pdwNumBytes,
        OVERLAPPED*    pOverlapped);

hFile  标识要读或者写的文件的句柄
pvBuffer  pvBuffer指向一个缓存,调用ReadFile函数时,系统将读出的数据保存在pvBuffer指向的缓存中;调用WriteFile函数时,系统将pvBuffer指向的缓存中存储的数据写入文件
nNumBytesTo*  标识要从设备读出或者写入多少字节的数据
pdwNumBytes  指向一个DWORD变量,函数会将成功从设备读取的字节数和成功写入设备的字节数保存在这个参数中
pOverlapped  标识函数是用同步还是异步的方式完成
可以看到,不管是读还是写,函数中都没有参数用来存放在文件哪个位置读或者写,这个存放位置永远保存在文件指针中。当然,我们可以通过SetFilePointerEx函数来设置文件指针的位置。
当调用CreateFile函数创建文件内核函数时,文件指针被初始化为0,即指向文件起始位置,此时若调用ReadFile函数读取10个字节的数据,文件指针会+10,也就是指向。。。

SetFilePointerEx()

设置文件指针的位置:
函数原型:

BOOL SetFilePointerEx(
        HANDLE    hFile,
        LARGE_INTEGER    liDistanceToMove,
        PLARGE_INTEGER    pliNewFilePointer,
        DWORD    dwMoveMethod);

hFile  我们想要修改哪个文件内核对象的文件指针 liDistanceToMove  标识文件指针要移动多少个字节
pliNewFilePointer  系统会在pliNewFilePointer参数指向的LARGE_INTEGER结构体中保存文件指针的新值
dwMoveMethod  标识移动文件指针的方式,有三个值可以选择:FILE_BEGIN 标识文件指针的起始位置为文件首,
可以传给SetFilePointerEx的dwMoveMethod参数的值 值 含义
FILE_BEGIN 文件指针起始位置为文件起始位置,当调用SetFilePointerEx成功后,文件指针将指向liDistanceToMove指向的位置。
FILE_CURRENT 文件指针起始位置为当前文件指针指向的位置 FILE_END 文件指针起始位置为文件末尾

用SetFilePointerEx()查询文件指针的位置:
Windows并没有提供一个可以查询文件指针的GetFilePointerEx函数,但我们可以调用SetFilePointerEx()函数,将liDistanceToMove设为0来达到相同的效果,代码如下:

1 LARGE_INTEGER  liCurrentPosition;
2 liCurrentPosition.QuadPart = 0;
3 SetFilePointerEx(hFile, liCurrentPosition, &liCurrentPosition, FILE_CURRENT);

1. CreateFile

这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。
函数的声明定义:

HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,              
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);

简介:
函数作用:可以用来创建和打开磁盘文件以及其他设备。
返回值:若调用成功,返回句柄值;反之返回INVALID_HANDLE_VALUE(-1),而不是NULL!!
参数详解:
pszName 表示设备的类型,也表示该类设备的某个实例
dwDesiredAccess 指定我们想以何种方式来和设备进行数据传输。

                         可以传给CreateFile的dwDesiredAccess参数的通用标志
含义
0 我们不希望从设备读取数据或向设备写入数据。如果只想改变设备的配置(比如只是修改文件的时间戳),那么可以传0
GENERIC_READ 允许对设备进行只读访问
GENERIC_WRITE 允许对设备进行只写访问。例如,备份软件会用到这个标志,如果想把数据发送到打印机,也可以使用这个标志。注意,GENERIC_WRITE标志并没有隐式地包含GENERIC_READ标志
GENERIC_READ GENERIC_WRITE 允许对设备进行读写操作。由于这个标志允许我们和设备之间自由地交换数据,因此也最为常用

dwShareMode
用来指定设备共享特权。当我们仍然打开着一个设备的时候,该参数可以控制其他的CreateFile调用,能够以何种方式来打开设备。

可以传给CreateFile的dwShareMode参数的与I/O相关的标志

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值