`

C++中WriteFile和ReadFile使用

阅读更多
C++中WriteFile和ReadFile使用

VC++编程 2009-01-06 11:29:29 阅读1021 评论2
字号:大中小


读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新的文件下来,然后保存到硬盘。WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。但这两个函数不但可以读取写磁盘的文件,也可以接收和发送网络的数据,还有读写串口、USB、并口等设备的数据。在读写文件里,首先就是先打开文件,然后判断打开是否成功。在写文件时,同时要注意磁盘的空间是否满等问题。在读取文件时,往往需要读取不同位置的文件,比如要读取一个4G的视频文件,就不可能完全把它读取到内存里,因此就需要对文件进行定位读取。

函数WriteFile和ReadFile声明如下:
WINBASEAPI
BOOL
WINAPI
WriteFile(
    __in        HANDLE hFile,
    __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
    __in        DWORD nNumberOfBytesToWrite,
    __out_opt   LPDWORD lpNumberOfBytesWritten,
    __inout_opt LPOVERLAPPED lpOverlapped
    );
   
WINBASEAPI
BOOL
WINAPI
ReadFile(
    __in        HANDLE hFile,
    __out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,
    __in        DWORD nNumberOfBytesToRead,
    __out_opt   LPDWORD lpNumberOfBytesRead,
    __inout_opt LPOVERLAPPED lpOverlapped
    );

hFile是文件句柄。
lpBuffer是读写数据缓冲区。
nNumberOfBytesToWrite是多少数据要写入。
lpNumberOfBytesWritten是已经写入多少数据。
nNumberOfBytesToRead是多少数据要读取。
nNumberOfBytesToRead是已经读取多少数据。
lpOverlapped是异步读写的结构。


调用函数的例子如下:
#001  //创建、写入、读取文件。
#002  //蔡军生 2007/10/21 QQ:9073204 深圳
#003  void CreateFileDemo(void)
#004  {
#005         //
#006         HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"),     //创建文件的名称。
#007               GENERIC_WRITE|GENERIC_READ,          // 写和读文件。
#008               0,                      // 不共享读写。
#009               NULL,                   // 缺省安全属性。
#010               CREATE_ALWAYS,          // 如果文件存在,也创建。
#011               FILE_ATTRIBUTE_NORMAL, // 一般的文件。      
#012               NULL);                 // 模板文件为空。
#013
#014         if (hFile == INVALID_HANDLE_VALUE)
#015         {
#016               //
#017               OutputDebugString(_T("CreateFile fail!\r\n"));
#018         }
#019
#020         //往文件里写数据。
#021         const int BUFSIZE = 4096;
#022         char chBuffer[BUFSIZE];         
#023         memcpy(chBuffer,"Test",4);
#024         DWORD dwWritenSize = 0;
#025        BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
#026         if (bRet)
#027         {
#028               //
#029               OutputDebugString(_T("WriteFile 写文件成功\r\n"));
#030         }
#031
#032         //先把写文件缓冲区的数据强制写入磁盘。
#033         FlushFileBuffers(hFile);
#034
#035         //
#036         //从文件里读取数据。
#037         LONG lDistance = 0;
#038         DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#039         if (dwPtr == INVALID_SET_FILE_POINTER)
#040         {
#041               //获取出错码。
#042               DWORD dwError = GetLastError() ;
#043               //处理出错。           
#044         }
#045
#046         DWORD dwReadSize = 0;
#047        bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
#048         if (bRet)
#049         {
#050               //
#051               OutputDebugString(_T("ReadFile 读文件成功\r\n"));
#052         }
#053         else
#054         {
#055               //获取出错码。
#056               DWORD dwError = GetLastError();
#057               //处理出错。           
#058               TCHAR chErrorBuf[1024];
#059               wsprintf(chErrorBuf,_T("GetLastError()=%d\r\n"),dwError);
#060               OutputDebugString(chErrorBuf);
#061         }
#062
#063  }
分享到:
评论

相关推荐

    使用CreateFile,ReadFile,WriteFile等API读写文件的简单类

    simple and easy——API文件读写类 http://blog.csdn.net/dahual/archive/2011/04/16/6327998.aspx

    Hook Api,hook ReadFile,hook WriteFile,hook LoadLibrary

    hook api,hook CreateFile,hook CloseHandle,hook ReadFile,hook WriteFile,hook LoadLibrary

    USBtongxun.rar_USB-IF _Usb设备管理_c++ readfile usb_readfile_usb wri

    如果你想打开一个USB管道,你首先要知道这种USB设备的GUID和管理道名称, 获取句柄以后就可以使用ReadFile/WriteFile进行读写了!

    C++中使用内存映射文件处理大文件

    文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数 ...

    Visual C++2010开发权威指南(共三部分).part1.rar

    5.21.3 在日期和时间选择器控件中使用自定义格式字符串 254 5.21.4 在日期和时间选择器控件中使用回调字段 254 5.21.5 处理日期和时间选择器控件中的通知消息 256 5.22 Visual C++ 2010 Month Canlendar控件简介与...

    VC++读写文件和注册表的源程序

    Win32 SDK对文件读写的支持,CreateFile函数、WriteFile函数、ReadFile函数的使用;MFC对文件读写的支持,  CFile类和CFileDialog的使用,文件过滤器的设置。win.ini文件和注册表的读写方式及相关知识点。

    read-file.rar_C语言 INI_MFC读写文本

    Win32 SDK对文件读写的支持,CreateFile函数、WriteFile函数、ReadFile函数的使用;MFC对文件读写的支持,CFile类和CFileDialog的使用,文件过滤器的设置。win.ini文件和注册表的读写方式及相关知识点。

    Visual C++2010开发权威指南.part07

    16.3.4 ReadFile()和WriteFile() 16.1.9 函数 632 16.3.5 一个利用匿名管道在父子 16.1.9 进程间通信的示例 632 16.4 命名管道通信 637 16.4.1 CreateNamedPipe()函数 637 16.4.2 ConnectNamedPipe()函数 639 16.4.3...

    VC中用内存映射文件处理大文件

    文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类等。一般来说,以上这些函数可以满足大多数...

    java关于字符串拼接的笔试题-HMock:用于在Haskell中进行测试的Mock框架

    Mockito、C++ 的 GoogleMock 和其他主流语言。 快速开始 为您需要模拟的功能定义类。 要使用 HMock 模拟任何内容,需要使用Monad子类来实现。 import Prelude hiding ( readFile , writeFile ) import qualified ...

    文档与串行化:VC++文件操作示例

    Win32 SDK对文件读写的支持,CreateFile函数、WriteFile函数、ReadFile函数的使用;MFC对文件读写的支持,CFile类和CFileDialog的使用,文件过滤器的设置。win.ini文件和注册表的读写方式及相关知识点。

    访问USB端口的程序.pdf

    访问USB端口的程序及示例(C++) 如果你想打开一个USB管道, 你首先要知道这种USB设备的GUID和管道名称, 获取句柄以后就可以使用ReadFile/WriteFile 进行读写了! 以下是代码,请参考!!

    操作系统课程设计文件管理系统

    一、 课程设计题目和目的 本设计的目的是通过设计和调试一个简单的文件系统,主要是模拟文件操作命令的执行...(8)写文件: writeFile (9)复制文件: copyFile (10)移动文件: moveFile (11)返回根目录 (12)退出

    操作系统课程设计——文件管理系统

    要求提供以下相关文件操作:(1)用户登录(3)创建目录: creatFileDir(4)删除目录: removeFileDir(5)创建文件: creatFile(6)删除文件: deleteFile(7)读文件: readFile(8)写文件: writeFile(9)复制文件:...

    实验五 复制文件

    完成一个目录复制命令mycp,包括目录下的文件和子目录, 运行结果如下: 说明: Linux: creat,read,write等系统调用,要求支持软链接 ...Windows: CreateFile(), ReadFile(), WriteFile(), CloseHandle()等函数

    StringUtils:该库在 std 中实现了许多常用但本机不支持的功能

    字符串实用程序该库在std::string 中实现了许多常用但本机不支持的函数,如Split 、 Join 、 Trim 、 Compact 、 ReplaceAll 、 ToLower 、 ToUpper 、 Repeat 、 ReadFile 、 WriteFile等。测试make test Passing: ...

    大型文件的读取,数据共享

    , WriteFile(), ReadFile() 等。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些领域需要几十GB,几百GB的海量存储,用通常的处理方法进行文件处理显然是行不通的。对大型文件的操作...

Global site tag (gtag.js) - Google Analytics