CreateFile,ReadFile,WriteFile,GetFileSize,SetFilePointer

CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式
ReadFile 或 WriteFile 都是对二进制数据进行操作SetFilePointer -- 在一个打开文件中设置新的读取位置。
SetFilePointer – 返回值Long,返回一个新位置,它采用从文件起始处开始算起的一个字节偏移量
HANDLE WINAPI CreateFile(
  __in          LPCTSTR lpFileName,             // 文件路径
  __in          DWORD dwDesiredAccess,          // 访问权限,GENERIC_READ | GENERIC_WRITE
  __in          DWORD dwShareMode,              // 共享模式,NULL | FILE_SHARE_READ | FILE_SHARE_WRITE
  __in          LPSECURITY_ATTRIBUTES lpSecurityAttributes,    // 安全属性
  __in          DWORD dwCreationDisposition,    // 创建配置,
                                                // CREATE_ALWAYS | CREATE_NEW | OPEN_ALWAYS | OPEN_EXISTING
  __in          DWORD dwFlagsAndAttributes,     // 扩展属性,
                                                // NULL | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY
  __in          HANDLE hTemplateFile            // 指定一个文件句柄,新文件将从这个文件中复制扩展属性。NULL
);

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

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

DWORD WINAPI GetFileSize(
  __in          HANDLE hFile,                   // 文件句柄
  __out         LPDWORD lpFileSizeHigh          // high-order 的返回值,一般设定为 NULL
);

DWORD SetFilePointer(
  HANDLE hFile,                 //文件句柄
  LONG lDistanceToMove,         //偏移量(低位)
  PLONG lpDistanceToMoveHigh,   //偏移量(高位)
  DWORD dwMoveMethod            //基准位置
                                //FILE_BEGIN:文件开始位置                                                                                
                                //FILE_CURRENT:文件当前位置
                                //FILE_END:文件结束位置
  );

      备注说明
对于第二个和第三个参数进行了详细的说明:

lpDistanceToMoveHigh 参数是用来管理大文件,如果要移到文件中任何位置,我们就必须设置这个参数的值。假如我们传入NULL值,
那么lDistanceToMove 的最大值是2^31–2(2G-2),因为所有文件指针的值是有符号的。因此,就算文件只有很少的机会能够达到这
个大小,我们最好还是把文件当成是一个大文件,并且在程序中使用64位的指针(就是lpDistanceToMoveHigh的值不是NULL)。如果
我们有一个压缩的并且文件很少的NTFS文件系统中,即使当前盘的空间不是很大的情况下,也很可能会有一些大文件。

假如lpDistanceToMoveHigh传入的不是NULL,那么lpDistanceToMoveHigh和lDistanceToMove会组成一个有符号的64位值。
lDistanceToMove参数是被作为这个值的低32们,lpDistanceToMoveHigh作为高32位,也就是说lpDistanceToMoveHigh是
lDistanceToMove的符号扩展名。

为了从0移动到2G位置,lpDistanceToMoveHigh必须设置为NULL或当作lDistanceToMove的符号扩展名。为了移动到大于2G的位置,
就要使用lpDistanceToMoveHigh和lDistanceToMove合成一个有符号的64位值。

读文件:
void read(const wchar_t* strPath)
{
    HANDLE hFile = ::CreateFile(strPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD nFileSize = ::GetFileSize(hFile, NULL);
        char* lpBuffer = new char[nFileSize];
        DWORD nNumberOfBytesRead;
        BOOL bRet = ::ReadFile(hFile, lpBuffer, nFileSize, &nNumberOfBytesRead, NULL);
        
        // TODO ...
        
        delete[] lpBuffer;
        CloseHandle(hFile);
    }
}

写文件:
void write(const wchar_t* strPath, const wchar_t* strContent, const int nContentSize)
{
    HANDLE hFile = ::CreateFile(strPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        DWORD nNumberOfBytesWritten;
        ::WriteFile(hFile, strContent, nContentSize, &nNumberOfBytesWritten, NULL);
        
        // TODO ...
        
        CloseHandle(hFile);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值