CreateFile函数

CreateFile函数

说明:

创建或打开文件或I / O设备。 最常用的I / O设备如下:
文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带驱动器,通信资源,邮槽和管道。 该函数返回一个句柄,该句柄可用于访问各种类型I / O的文件或设备,具体取决于文件或设备以及指定的标志和属性。
要将此操作作为事务操作执行,从而产生可用于事务I / O的句柄,请使用CreateFileTransacted函数。

原型:

HANDLE CreateFile(
 LPCTSTR lpFileName,       // 指向文件名的指针 
 DWORD dwDesiredAccess,    // 访问模式(写 / 读) 
 DWORD dwShareMode,        // 共享模式 
 LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针 
 DWORD dwCreationDisposition,   // 如何创建 
 DWORD dwFlagsAndAttributes,    // 文件属性 
 HANDLE hTemplateFile           // 用于复制文件句柄 
);

0x01.参数

这里写图片描述

返回值

如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。即使函数成功,但若文件存在,且指定了 CREATE_ALWAYSOPEN_ALWAYSGetLastError 也会设为 ERROR_ALREADY_EXISTS

0x02. ReadFile函数

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

原型

BOOL WINAPI ReadFile(
  _In_        HANDLE       hFile,               // 文件句柄
  _Out_       LPVOID       lpBuffer,            // 接收数据用的 buffer
  _In_        DWORD        nNumberOfBytesToRead,// 要读取的字节数
  _Out_opt_   LPDWORD      lpNumberOfBytesRead, // 实际读取到的字节数
  _Inout_opt_ 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;
}

0x03.WriteFile函数

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

原型

BOOL 
WINAPI WriteFile(
  _In_        HANDLE       hFile,    // 文件句柄
  _In_        LPCVOID      lpBuffer, // 要写入的数据
  _In_        DWORD        nNumberOfBytesToWrite,// 要写入的字节数
  _Out_opt_   LPDWORD      lpNumberOfBytesWritten,// 实际写入的字节数
  _Inout_opt_ 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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值