WriteFile和ReadFile函数

来源:互联网 发布:网络舆情应对方法 编辑:程序博客网 时间:2024/05/22 02:16

 

读写文件是每个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是异步读写的结构。


调用函数的例子如下:
//创建、写入、读取文件。
//蔡军生 2007/10/21 QQ:9073204 深圳
  void CreateFileDemo(void)
  {
        //
        HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"),    //创建文件的名称。
              GENERIC_WRITE|GENERIC_READ,          // 写和读文件。
              0,                      // 不共享读写。
              NULL,                  // 缺省安全属性。
              CREATE_ALWAYS,          // 如果文件存在,也创建。
              FILE_ATTRIBUTE_NORMAL, // 一般的文件。     
              NULL);                // 模板文件为空。

        if (hFile == INVALID_HANDLE_VALUE)
       {
              //
              OutputDebugString(_T("CreateFile fail!\r\n"));
        }

        //往文件里写数据。
        const int BUFSIZE = 4096;
        char chBuffer[BUFSIZE];         
        memcpy(chBuffer,"Test",4);
        DWORD dwWritenSize = 0;
        BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
        if (bRet)
        {
              //
              OutputDebugString(_T("WriteFile 写文件成功\r\n"));
        }

        //先把写文件缓冲区的数据强制写入磁盘。
        FlushFileBuffers(hFile);

        //
        //从文件里读取数据。
        LONG lDistance = 0;
        DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
        if (dwPtr == INVALID_SET_FILE_POINTER)
        {
              //获取出错码。
              DWORD dwError = GetLastError() ;
              //处理出错。           
        }

        DWORD dwReadSize = 0;
        bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
        if (bRet)
        {
              //
              OutputDebugString(_T("ReadFile 读文件成功\r\n"));
        }
        else
        {
              //获取出错码。
              DWORD dwError = GetLastError();
              //处理出错。           
              TCHAR chErrorBuf[1024];
              wsprintf(chErrorBuf,_T("GetLastError()=%d\r\n"),dwError);
              OutputDebugString(chErrorBuf);
        }

  }

 

http://blog.chinaunix.net/uid-20735711-id-1882671.html

0 0
原创粉丝点击