zoukankan      html  css  js  c++  java
  • VC++ 利用CreateFile、ReadFile和WriteFile实现CopyFile

    1. CreateFile:这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

    参照:http://www.cppblog.com/yishanhante/articles/19545.html

    2. ReadFile:从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作

    BOOL ReadFile(
    HANDLEhFile,//文件的句柄
    LPVOIDlpBuffer,//用于保存读入数据的一个缓冲区
    DWORDnNumberOfBytesToRead,//要读入的字节数
    LPDWORDlpNumberOfBytesRead,//指向实际读取字节数的指针
    LPOVERLAPPEDlpOverlapped
    //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。
    //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
    );
     

    参数说明

    HANDLE hFile, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。
    LPVOID lpBuffer,接收数据的缓冲区。
    DWORD nNumberOfBytesToRead,指定要读取的字节数。
    LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。
    LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。
    FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。
     
     
    返回值:
    调用成功,返回非0
    调用不成功,返回为0
    会设置GetLastError。如启动的是一次异步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早已抵达了文件的结尾。
     
    3.
    BOOL WriteFile(
    HANDLEhFile,//文件句柄
    LPCVOIDlpBuffer,//数据缓存区指针
    DWORDnNumberOfBytesToWrite,//你要写的字节数
    LPDWORDlpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
    LPOVERLAPPEDlpOverlapped//OVERLAPPED结构体指针
    );
    例子:
     1.利用CreateFile和ReadFile获取文件的buffer
     1 voidReadFile(char*str)
     2 {
     3 HANDLEpfile;
     4 pfile=::CreateFile(str,GENERIC_READ,0,NULL,OPEN_EXISTING,
     5 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS,NULL);//用这个函数比OpenFile好
     6 if(pfile==INVALID_HANDLE_VALUE)
     7 {
     8 MessageBox(NULL,"打开文件失败","Error",MB_OK);
     9 CloseHandle(pfile);//一定注意在函数退出之前对句柄进行释放。
    10 return;
    11 }
    12 DWORDfilesize=GetFileSize(pfile,NULL);
    13 char*buffer=newchar[filesize+1];//最后一位为'/0',C-Style字符串的结束符。
    14 DWORDreadsize=0;
    15 ReadFile(pfile,buffer,filesize,&readsize,NULL);
    16 
    17 memset(buffer,0,filesize+1);
    18 
    19 buffer[filesize]=0;
    20 MessageBox(NULL,buffer,"BufferSize",MB_OK);
    21 //善后工作
    22 delete[]buffer;//注意是delete[]而不是delete
    23 CloseHandle(pfile);//关闭句柄。
    24 }
     
     2.利用CreateFile、ReadFile和 WriteFile实现CopyFile函数
     1 void MyCopyFile(wstring pExitFile,wstring pNewFile)
     2 {
     3     HANDLE pRfile;
     4     pRfile=::CreateFile(pExitFile.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
     5         FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS,NULL);//用这个函数比OpenFile好
     6     if(pRfile==INVALID_HANDLE_VALUE)
     7     {
     8         //MessageBox(NULL,"打开文件失败","Error",MB_OK);
     9         CloseHandle(pRfile);//一定注意在函数退出之前对句柄进行释放。
    10         return ;
    11     }
    12     DWORD filesize=GetFileSize(pRfile,NULL);
    13     char*buffer=new char[filesize+1];//最后一位为'/0',C-Style字符串的结束符。
    14     memset(buffer,0,filesize+1);
    15     DWORD readsize=0;
    16     ReadFile(pRfile,buffer,filesize,&readsize,NULL);
    17     buffer[filesize]=0;
    18     CloseHandle(pRfile);//关闭句柄
    19 
    20     //写数据
    21 
    22     HANDLE pWfile;
    23     pWfile=::CreateFile(pNewFile.c_str(),GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS,
    24         FILE_ATTRIBUTE_NORMAL,NULL);//用这个函数比OpenFile好
    25     if(pWfile==INVALID_HANDLE_VALUE)
    26     {
    27         //MessageBox(NULL,"打开文件失败","Error",MB_OK);
    28         CloseHandle(pWfile);//一定注意在函数退出之前对句柄进行释放。
    29         return ;
    30     }
    31 
    32     DWORD writesize = 0;
    33 
    34     ::WriteFile(pWfile,buffer,filesize,&writesize,NULL);
    35 
    36     //善后工作
    37     delete[]buffer;//注意是delete[]而不是delete
    38     CloseHandle(pWfile);//关闭句柄
    39 }
  • 相关阅读:
    经典矩阵dp寻找递增最大长度
    有符号char转无符号short
    正则表达式学习之grep,sed和awk
    Git学习总结
    Linux下的压缩及归档
    bash脚本编程学习笔记(二)
    bash脚本编程学习笔记(一)
    Linux磁盘及文件系统(三)Linux文件系统
    Linux磁盘及文件系统(二)Linux下磁盘命名和分区
    Linux磁盘及文件系统(一)
  • 原文地址:https://www.cnblogs.com/chechen/p/4095627.html
Copyright © 2011-2022 走看看