win32 api 文件措置惩罚惩罚

时间:2022-05-04 09:09:40

编写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 文件措置惩罚惩罚