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