当前位置: 首页 > news >正文

window api 文件操作之CreateFile、ReadFile和WriteFile

​​​​​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
);

参数列表:

参数类型描述
lpFileNameString ,要打开的文件的名字
dwDesiredAccess(期望的存取权限)Long ,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareModeLong ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributesSECURITY_ATTRIBUTES ,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
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 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件;
hTemplateFileLong ,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

2. ReadFile

  从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。 
  函数声明定义:

BOOL WINAPI ReadFile(
    __in HANDLE hFile, // 文件句柄
    __out LPVOID lpBuffer, // 接收数据用的 buffer
    __in DWORD nNumberOfBytesToRead, // 要读取的字节数
    __out LPDWORD lpNumberOfBytesRead, // 实际读取到的字节数
    __in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);

代码示例:

BOOL Read(char *filePath)
{
    HANDLE pFile;
    DWORD fileSize;
    char *buffer,*tmpBuf;
    DWORD dwBytesRead,dwBytesToRead,tmpLen;
 
    pFile = CreateFile(filePath,GENERIC_READ,          
        FILE_SHARE_READ,
        NULL,               
        OPEN_EXISTING,        //打开已存在的文件 
        FILE_ATTRIBUTE_NORMAL, 
        NULL);
 
    if ( pFile == INVALID_HANDLE_VALUE)
    {
        printf("open file error!\n");
        CloseHandle(pFile);
        return FALSE;
    }
 
    fileSize = GetFileSize(pFile,NULL);          //得到文件的大小
 
    buffer = (char *) malloc(fileSize);
    ZeroMemory(buffer,fileSize);
    dwBytesToRead = fileSize;
    dwBytesRead = 0;
    tmpBuf = buffer;
 
    do{ //循环读文件,确保读出完整的文件    
 
        ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);
 
        if (dwBytesRead == 0)
            break;
 
        dwBytesToRead -= dwBytesRead;
        tmpBuf += dwBytesRead;
 
        } while (dwBytesToRead > 0);
 
        //  TODO 处理读到的数据 buffer
 
    free(buffer);
    CloseHandle(pFile);
 
    return TRUE;
}

3. WriteFile

  将数据写入一个文件。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。 
函数声明定义:

BOOL WINAPI WriteFile(
  __in          HANDLE hFile,                   // 文件句柄
  __in          LPCVOID lpBuffer,               // 要写入的数据
  __in          DWORD nNumberOfBytesToWrite,    // 要写入的字节数
  __out         LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
  __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 结构,一般设定为 NULL
);

代码示例:

BOOL Write(char *buffer, DWORD contentLen)
{
    HANDLE pFile;
    char *tmpBuf;
    DWORD dwBytesWrite,dwBytesToWrite;
 
    pFile = CreateFile(filePath,GENERIC_WRITE,          
        0,
        NULL,               
        CREATE_ALWAYS,        //总是创建文件
        FILE_ATTRIBUTE_NORMAL, 
        NULL);
 
    if ( pFile == INVALID_HANDLE_VALUE)
    {
        printf("create file error!\n");
        CloseHandle(pFile);
        return FALSE;
    }
 
    dwBytesToWrite = contentLen;
    dwBytesWrite = 0;
 
    tmpBuf = buffer;
 
    do{ //循环写文件,确保完整的文件被写入  
 
        WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);
 
        dwBytesToWrite -= dwBytesWrite;
        tmpBuf += dwBytesWrite;
 
        } while (dwBytesToWrite > 0);
 
    CloseHandle(pFile);
 
    return TRUE;
}

from:http://blog.csdn.net/jeanphorn/article/details/44982273

相关文章:

  • 服务器硬件基础知识
  • XPath详解
  • XML详解
  • 串口是什么
  • USB接口
  • ch340是什么芯片
  • 最大路径长度限制
  • 启动配置数据(BCD)存储
  • 什么是EV 代码签名证书
  • 代码签名是什么
  • 使用DD_XOFT实现带有安全控件、U盾的输入
  • Windows驱动开发入门指引
  • MapVirtualKey
  • 键盘扫描码与虚拟码的关系
  • 事件和消息的区别
  • 收藏网友的 源程序下载网
  • [deviceone开发]-do_Webview的基本示例
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 2019.2.20 c++ 知识梳理
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • bearychat的java client
  • JavaScript HTML DOM
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • October CMS - 快速入门 9 Images And Galleries
  • React的组件模式
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Web设计流程优化:网页效果图设计新思路
  • WePY 在小程序性能调优上做出的探究
  • 测试如何在敏捷团队中工作?
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 技术:超级实用的电脑小技巧
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 那些被忽略的 JavaScript 数组方法细节
  • 区块链分支循环
  • 为视图添加丝滑的水波纹
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 数据库巡检项
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Panda3d 碰撞检测系统介绍
  • # 达梦数据库知识点
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma data_seg 共享数据区(转)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $jQuery 重写Alert样式方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Git) gitignore基础使用
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (算法)前K大的和
  • (转)可以带来幸福的一本书
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Net 8.0 新的变化
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 服务 ServiceController