win32 api 文件处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32 api 文件处理相关的知识,希望对你有一定的参考价值。

编写winapi程序,要引入 windows.h 头文件

对于控制台程序来说,入口函数为 int main() , 对应的用于接受命令行的入口函数为 int main( int argc ,  LPTSTR argv[] ) , 其中的 LPTSTR 可视为 字符指针

windows的数据宏名命名有一定的规则 如 LPTSTR 中 LP为 long pointer长指针 ,T 为通用之意(ansi和unicode字符处理),STR即string

一般以LP和P开头的都为指针类型

 

对一个文件进行操作,首先要获得文件句柄,我理解这个句柄就是对文件的引用,句柄的类型为HANDLE

首先使用CreateFile函数创造句柄,函数原型如下

HANDLE CreateFile (

    LPCTSTR    lpName,
    DWORD    dwAccess,
    DWORD    dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD    dwCreate,
    DWORD    dwAttrsAndFlags,
    HANDLE    hTempateFile )

其中lpName为文件所在路径,LPCTRSTR与上面的类似,多出来的C表示常量const,所以此参数可以视为字符串,注意文件路径中的斜杠要转义

dwAccess为指定访问方式,可以输入GENERIC_READ或者GENERIC_WRITE,或GENERIC_READ | GENERIC_WRITE表示同时具有读写访问

dwShareMode为文件共享方式,输入0为不能共享,即只能打开这一个HANDLE。其他可选的参数有FILE_SHARE_READ和FILE_SHARE_WRITE

lpSecurityAttribute指定安全性,可以使用NULL表示默认安全性

dwCreate的参数如下:

  CREATE_NEW 创建新文件,如果指定文件已经存在则创建失败

  CREATE_ALWAYS 创建新文件,如果存在则覆盖

  OPEN_EXISTING 打开现有文件,如果文件不存在则失败

  OPEN_ALWAYS 打开现有文件,如果不存在则创建

  TRUNCATE_EXISTING 需指定GENERIC_WRITE,文件存在则内容被销毁,文件不存在则失败

dwAttrsAndFlags 指定文件属性和标志,一般为FILE_ATTRIBUTE_NORMAL

hTemplateFile 指定创建文件时的模板,通常为NULL

 

创建句柄后通过比较该句柄是否为 INVALID_HANDLE_VALUE 来判断是否创建成功

 

对文件的一些操作函数如下:

读文件 ReadFile

BOOL ReadFile (
               
    HANDLE    hFile ,
    LPVOID    lpBuffer ,
    DWORD    nNumberOfBytesToRead ,
    LPDWORD    lpNumberOfBytesRead ,
    LPOVERLAPPED    lpOverlapped )

第一项是CreateFile创建的句柄

第二项为读字符存放的缓冲区,可自己定义一个字符数组传入,字符数组使用前用ZeroMemory函数将此区域清零

第三项为要读入字节的数量,为输入参数,第四项为实际读入字节的数量,为输出参数,可以比较这两个值是否相等判断操作是否失败

第五项目前传入NULL

 

写文件 WriteFile

BOOL WriteFile (
               
    HANDLE    hFile ,
    LPVOID    lpBuffer ,
    DWORD    nNumberOfBytesToWrite ,
    LPDWORD    lpNumberOfBytesWrite ,
    LPOVERLAPPED    lpOverlapped )

与上一个函数类似,其中lpBuffer是要写入的字符

 

句柄创建使用后应该关闭,使用 BOOL CloseHandle ( HANDLE object ),关闭一个无效句柄或者关闭两个句柄将抛出异常,无须关闭也不应关闭标准设备句柄

 

示例程序:复制文件  命令行需要带两个参数,第一个参数为源文件路径,第二个参数为目的文件路径

#include <stdio.h>
#include <windows.h>
#define BUF_SIZE 256

int main(int argc , LPTSTR argv[])
{

   HANDLE hIn , hOut;
   DWORD nIn , nOut ;
   CHAR buffer[BUF_SIZE];

   if(argc != 3){
        printf("wrong usage");
        return 1;
    }
    hIn = CreateFile(argv[1] , GENERIC_READ , FILE_SHARE_READ , NULL
                     , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
    if(hIn == INVALID_HANDLE_VALUE){
        printf("error:%x\n",GetLastError());
        return 3 ;
    }
    hOut = CreateFile(argv[2] , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS
                      , FILE_ATTRIBUTE_NORMAL , NULL);
        if(hOut == INVALID_HANDLE_VALUE){
        printf("error:%x\n",GetLastError());
        return 3 ;
    }
    while (ReadFile(hIn, buffer ,BUF_SIZE ,&nIn , NULL)&&nIn>0){
        WriteFile(hOut , buffer , nIn ,&nOut , NULL);
        if (nIn != nOut){
            printf("error : %x", GetLastError());
            return 4;
        }
    }

    CloseHandle(hIn);
    CloseHandle(hOut);
    return 0;
}

 

以上是关于win32 api 文件处理的主要内容,如果未能解决你的问题,请参考以下文章

win32 API 搜索路径失败

win32 API 编程

UWP是否具有同步文件读/写API?

Win32API 窗口程序的创建7大步骤

win32 api CreateFile 和 WriteFile 问题

Win32编程API 基础篇 -- 3.消息处理 根据英文教程翻译