首页 > 代码库 > Win32 API文件读写操作

Win32 API文件读写操作

1、文件的创建和打开

  HANDLE CreateFile(

    LPCTSTR lpFileName, 

    DWORD dwDesiredAccess, 

    DWORD dwShareMode,         

    LPSECURITY_ATTRIBUTES lpSecurityAttributes,

    DWORD dwCreationDisposition, 

    DWORD dwFlagsAndAttributes, 

    HANDLE hTemplateFile        

  );

    lpFileName:指定用于创建或打开的对象的名称;

    dwDesiredAccess:指定对象的访问方式,包括:

      0  --指定对象可设备查询访问;

      GENERIC_READ  --指定对象可读访问,可从文件中读取数据,并可移动文件中的指针;

      GENERIC_WRITE  --指定对象可写访问,可向文件中写入数据,并可移动文件中的指针;

    dwShareMode:指定共享方式,包括:

      FILE_SHARE_DELETE

      FILE_SHARE_READ

      FILE_SHARE_WRITE

    lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,用来确定返回的句柄是否能够被子进程所继承;

    dwCreationDisposition:指定如何创建文件,包括:

      CREATE_NEW  --创建一个新文件,如果文件已存在,则函数调用失败;

      CREATE_ALWAYS  --创建一个新文件,如果文件已存在,清空该文件现有属性

      OPEN_EXISTING  --打开文件,如果文件不存在,则函数调用失败

      OPEN_ALWAYS  --如果文件存在,则打开文件;如果文件不存在,则创建一个新文件;

      TRUNCATE_EXISTING  --打开文件,文件打开时被截取使得其大小为0字节,调用该函数必须用GENERIC_WRITE的访问方式来打开文件;如果文件不存在,则函数调用失败;

    dwFlagsAndAttributes:设置文件属性和标志,包括:

      FILE_ATTRIBUTE_ARCHIVE  --该文件是存档文件

      FILE_ATTRIBUTE_HIDDEN  --该文件是隐藏文件

      FILE_ATTRIBUTE_NORMAL  --该文件没有其他属性设置

      FILE_ATTRIBUTE_OFFLINE  --文件的数据已在物理上移动到离线存储设备中,不能立即使用

      FILE_ATTRIBUTE_READONLY  --该文件为只读文件

      FILE_ATTRIBUTE_SYSTEM  --该文件是操作系统文件

      FILE_ATTRIBUTE_TEMPORARY  --该文件做暂时存储使用

      FILE_FLAG_WRITE_THROUGH  --指示系统不经过缓存而直接将数据写入磁盘

      FILE_FLAG_OVERLAPPED  --指示系统初始化该文件对象,以便那些需要较长时间才能完成的操作返回ERROR_IO_PENDING标志

      FILE_FLAG_NO_BUFFERING  --指示系统以不带系统缓冲的方式打开该文件

      FILE_FLAG_RANDOM_ACCESS  --指示该文件是随机访问方式

      FILE_FLAG_SEQUENTIAL_SCAN  --指示该文件是顺序访问方式

      FILE_FLAG_DELETE_ON_CLOSE  --指示当该文件的所有句柄都被关闭后,操作系统将立即删除该文件

      FILE_FLAG_BACKUP_SEMANTICS  --表明是为备份或存储操作而打开或创建该文件的

      FILE_FLAG_POSIX_SEMANTICS  --表明将根据POSIX规则访问该文件

      FILE_FLAG_OPEN_REPARSE_POINT  --指定此标志禁止NTFS再分析点的再分析行为

      FILE_FLAG_OPEN_NO_RECALL  --表明虽然请求了该文件的数据,但该数据仍继续保存在远程存储器中而不应被传回本地存储器

    hTemplateFile:如果打开一个已有文件,则这个参数将被忽略;要使这个参数有效必须满足:为创建新文件,给该参数传递的文件句柄必须是使用GENERIC_READ方式打开的;

2、文件的写入

  BOOL WriteFile(

    HANDLE hFile,                   

    LPCVOID lpBuffer,               

    DWORD nNumberOfBytesToWrite,    

    LPDWORD lpNumberOfBytesWritten,

    LPOVERLAPPED lpOverlapped       

  );

    hFile:指定要写入数据的文件的句柄

    lpBuffer:指向包含将要写入文件的数据的缓冲区的指针

    nNumberOfBytesToWrite:指明要向文件中写入的字节数

    lpNumberOfBytesWritten:用来接收实际写入到文件中的字节数

    lpOverlapped:指向OVERLAPPED结构体的指针,这个参数若要起作用,须在CreateFile打开文件设置文件属性时添加FILE_FLAG_OVERLAPPED标记,告诉系统需要异步地访问这个文件,默认情况下是以同步IO的方式访问的

3、文件的读取

  BOOL ReadFile(

    HANDLE hFile,               

    LPVOID lpBuffer,            

    DWORD nNumberOfBytesToRead, 

    LPDWORD lpNumberOfBytesRead,

    LPOVERLAPPED lpOverlapped   

  );

    hFile:指定要读取其数据的文件的句柄

    lpBuffer:指向一个缓冲区的指针,该缓冲区将接收从文件中读取的数据

    nNumberOfBytesToRead:指定从文件读取的字节数

    lpNumberOfBytesRead:用来接收实际读到的字节数

    lpOverlapped:指向OVERLAPPED结构体的指针,这个参数若要起作用,须在CreateFile打开文件设置文件属性时添加FILE_FLAG_OVERLAPPED标记,告诉系统需要异步地访问这个文件,默认情况下是以同步IO的方式访问的

 

例:

//定义一个句柄变量
HANDLE hFile;
//创建文件
hFile = CreateFile("1.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
//接收实际写入的字节数
DWORD dwWrites;
//写入数据
WriteFile(hFile, "hello world!", strlen("hello world!"), &dwWrites, NULL);
//关闭文件句柄
CloseHandle(hFile);
HANDLE hFile;
//打开文件
hFile = CreateFile("1.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
//接收实际读取到的数据
char ch[100];
//接收实际读取到的字节数
DWORD dwReads;
//读取数据
ReadFile(hFile, ch, 100, &dwReads, NULL);
//设置字符串结束字符
ch[dwReads] = 0;
//关闭打开的文件对象的句柄
CloseHandle(hFile);
//显示读取到的数据
MessageBox(ch);

 

Win32 API文件读写操作