CreateFile,WriteFile,ReadFile

注意:
CreateFile 跟 fopen 不同,打开文件时不区分 文本方式 或 二进制 方式
ReadFile 或 WriteFile 都是对二进制数据进行操作

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
);

读文件:
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);
    }
}

CreateFile,WriteFile,ReadFile,布布扣,bubuko.com

时间: 2024-10-24 20:14:31

CreateFile,WriteFile,ReadFile的相关文章

C/C++ 文件操作之CreateFile、ReadFile和WriteFile

1. CreateFile 这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件.文件流.目录.物理磁盘.卷.终端流等.如执行成功,则返回文件句柄. INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError . 函数的声明定义: HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName, _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, _In_o

驱动程序调用驱动程序1

除了在Win32下面可以调用ReadFile, WriteFile之类的函数打开设备对象, 在内核中也是可以的, 而且方法比用户态这边更多. 首先这种方法就是Win32上面相同的方式了, 直接打开设备. 内核也有一套函数类似Win32下面的CreateFile, WriteFile, ReadFile. 下面代码那个写入设备基本就没有什么好说的. 和Win32上面的套路差不多, Win32上面其实也有一个WriteFileEx. 就是可以设置回调函数那个. 内核里面的函数就合二为一了, 都是Zw

派遣例程与IRP结构

提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I/O请求后,在内核中由操作系统将其转化为IRP的数据结构,并"派遣"到对应驱动的派遣函数中,如图21.1.6所示. Ring3程序调用kernel32.dll导出的DeviceIoControl函数后,会调用到ntdll.dll导出的NtDeviceIoControlFile函数,进而调用

完成端口与高性能服务器程序开发

原文出处:http://blog.csdn.NET/roen/archive/2007/03/19/1533378.aspx 以一个文件传输服务端为例,在我的机器上它只起两个线程就可以为很多个客户端同时提供文件下载服务,程序的性能会随机器内CPU个数的增加而线性增长,我 尽可能做到使它清晰易懂,虽然程序很小却用到了NT 5的一些新特性,重叠IO,完成端口以及线程池,基于这种模型的服务端程序应该是NT系统上性能最好的了. 首先.做为完成端口的基础,我们应该理解重叠IO,这需要你已经理解了内核对象及

IRP 与 派遣函数

什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I/O 请求. 那什么是 I/O 请求呢? 上层程序与驱动程序之间通信时,上层会发出I/O请求,即输入输出请求包(I/O Request package) 用户模式下(上层)与所有驱动程序之间的I/O请求,全部由操作系统转化为一个叫 IRP 的数据结构,不同的 IRP 会被派遣到不同的派遣函数(Dis

Win32多线程程序设计读书笔记

为什么多线程? 多线程并不一定是最好的,合适才是最好的. 多线程主要的优点是价廉物美,启动快.退出快.与其他线程共享核心对象,很容易实现共产主义的伟大梦想.但是其又有不可预期.测试困难的缺点. 使用好多线程,就是要知道何时应该用多线程,何时不该用.如果应该用多线程,如何解决Race Condition问题?如何共享数据?如何提高效率?如何同步线程和数据?总结起来就是: 有始有终,线程的创建和释放都要靠自己 不抛弃不放弃,等一等线程,让它做完自己的工作 文明有序,资源占用无冲突 但是有时候却不建议

驱动程序入门篇

驱动程序分为两类: 一个是 Kernel(内核) 模式驱动,另一个是 Windows (用户窗口层)模式驱动. 这两种模式本质是相同,但细节不同.本文介绍的是内核模式驱动和驱动程序的安装与使用. 驱动程序同普通的 .exe,.dll 一样,都属于 PE 文件,而且都有一个入口函数.但 .exe 中,入口函数是 main() / WinMain() 和 Unicode 的 wmain() / wWinmain(),.dll 的入口函数则可有可无,它是 DllMain(). 所以驱动程序也有入口函数

派遣函数

派遣函数是Windows驱动程序中的重要概念,驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理. 用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同的的派遣函数中,这也是派遣函数名字的由来. IRP处理机制类似Windows应用程序中的“消息处理”机制,驱动程序接到不同类型的IRP之后,会进入不同的派遣函数,在派遣函数中IRP得到处理. IRP的两个基本的属性:一个是MajorFuntion,一个是

usb驱动开发篇简易介绍

我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为我对于那些高层的东西写得很少.倘若再讲,有班门弄斧之嫌,呵呵! 作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驱动程序不同,它应该是WDM类型的. USB的WDM接口框图如下(这个图可以说是USB软件总体框图) 对于HID的设备,就可以采用上图左上边的结构,其它类的话采用右上的结构,其实右边的结构可以又细分成两层,一层是Class Driver,一层是Mini