实验七 使用无缓冲的方式实现文件读\写
一、实验目的
- 熟悉Windows系统文件读\写相关API。
- 掌握无缓冲方式实现文件读\写相关参数的设置。
二、实验准备
相关API函数的介绍
文件创建
函数CreateFile( ) 用于创建一个新文件,如果文件已经存在,则得到该文件的句柄。该函数的参数dwFalgsAndAttributes决定了文件的传输方式,对于普通的文件传输,可将参数设置为FILE_ATTRIBUTE_NORMAL;而若设置为FILE_FLAG_NO_BUFFERING,表示不使用高速缓存进行文件传输;若同时使用标志FILE_FLAG_NO_BUFFERING和FILE_FLAG_OVERLAPPED,可对文件进行异步传输;若设置为FILE_FLAG_SEQUENTIAL_SCAN,表示使用高速缓存进行文件的传输。
- 函数原型
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //读/写访问模式
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //文件存在标志
DWORD dwFlagsAndAttributes, //文件属性
DWORD hTemplateFile //指向访问模板文件的句柄
) ;
- 参数说明
- lpFILEName:指向文件名的指针。
- dwDesiredAccess:指出访问文件的类型,可以是读访问、写访问、读 / 写访问或查询访问。该参数可以是表4-1中的组合。
- dwShareMode:指出文件共享模式。若dwShareMode的值为0,表示目标不能被共享。若要共享文件,可以使用表4-2中的组合。
-
表4-1 不同值的描述
-
值 描述 0 查询访问 GENERIC_READ 读访问,从文件中读出数据,且移动文件指针。当需要对文件进行读写时,该属性可以与GENERIC_WRITE组合使用 GENERIC_WRITE 写访问,将数据写入文件,且移动文件指针。当需要对文件进行读/写时,该属性可以与GENERIC_READ组合使用 -
表4-2 dwShareMode的值
-
值 描述 FILE_SHARE_DELETE 仅当删除访问时,对文件的打开操作才能成功 FILE_SHARE_READ 仅当读访问时,对文件的打开操作才能成功 FILE_SHARE_WRITE 仅当写访问时,对文件的打开操作才能成功
- lpSecurityAttributes:指向安全属性的指针。为NULL时,子进程可以继承该安全描述符。
- dwCreationDisposition:文件存在标志。指出当文件不存在时,可以对文件进行何种操作。可以取表4-3中的值。
- 表4-3 dwCreationDisposition 的值
-
值 描述 CREAT_NEW 创建新文件。若文件已存在,则该函数调用失败 CREAT_ALWAYS 创建新文件。若文件已存在,则该函数覆盖原文件的内容且清空现有属性 OPEN_EXISTING 打开已存在文件,若文件不存在,则该函数打开失败 OPEN_ALWAYS 若文件存在,则打开该文件,若文件不存在,则以CREAT_NEW方式创建文件 TRUNCATE_EXISTING 打开文件,并将文件的大小截取为0
- dwFlagsAndAttributes:指出文件属性和标志。除了FILE_ATTRIBUTE_NORMAL属性之外,参数dwFlagsAndAttributes可以取表4-4中任何属性的组合。参数dwFlagsAndAttributes还可以取表4-5中任何属性的组合。
-
表4-4 属性描述
-
属性 描述 FILE_ATTRIBUTE_ARCHIVE 文件可以被存档 FILE_ATTRIBUTE_HIDDEN 文件可以被隐藏 FILE_ATTRIBUTE_NORMAL 文件没有其他属性,该属性仅当单独时使用才有效 FILE_ATTRIBUTE_OFFLINE 文件中的数据被脱机存储,文件中的数据不能立即有效 FILE_ATTRIBUTE_READONLY 文件只能读 FILE_ATTRIBUTE_SYSTEM 文件被系统使用 FILE_ATTRIBUTE_TEMPORARY 文件被临时存储 -
表4-5 属性补充
-
属性 描述 FILE_FLAG_WRITE_THROUGH 系统对文件的任何写操作,当缓冲的内容改变时立即写回磁盘 FILE_FLAG_OVERLAPPED 异步读/写,使用该属性时,文件指针将不被保留 FILE_FLAG_NO_BUFFERING 文件不使用缓冲 FILE_FLAG_RANDOM_ACCESS 文件随机访问 FILE_FLAG_SEQUENTIAL_SCAN 文件被顺序访问 FILE_FLAG_DELETE_ON_CLOSE 当文件句柄关闭时,文件立即被删除 FILE_FLAG_BACKUP_SEMANTICS 文件用于备份或转储 FILE_FLAG_POSIX_SEMANTICS 文件访问遵循POSIX协议。
- hTemplateFile:指向访问模板文件的句柄,可以将其设置为空。
返回值:文件创建成功,该函数返回文件句柄,否则返回INVALID_HANDLE_VALUE,可调用函数GetLastError( )查询失败的原因。
- 用法举例
-
HANDLE handle; handle