这几天看windows API一日一练,博主给画出了道道,我来填填具体点的内容。
需求:想操作文件、串口、并口、USB等等。
原理层:其实很简单,就三步:打开,操作,然后关闭。
实践层1:打开用CreateFile,读写操作用WriteFile、ReadFile,关闭用CloseHandle。
实践层2:学习各个API怎么用。
学习API,不就是先了解其作用,再瞅瞅返回值,最后学习学习参数怎么用么。
1、CreateFile
<作用>CreateFile:打开或创建一个文件、串口、并口、USB等等。还可以打开路径喔,亲。
<返回值>成功返回句柄,dwCreationDisposition设为CREATE_ALWAYS或OPEN_ALWAYS时,GetLastError返回ERROR_ALREADY_EXISTS。失败返回INVALID_HANDLE_VALUE。
<参数介绍>
HANDLECreateFile(
LPCTSTRlpFileName,文件路径。ANSI:最大MAX_PATH个字符;Unicode:最大32767,and prepend "\\?\" to the path.
DWORDdwDesiredAccess,访问方式,如GENERIC_READ
DWORDdwShareMode,读写的共享方式。为0时,不共享读写,对象不能被再次打开。此属性设置不要与访问方式冲突。
LPSECURITY_ATTRIBUTESlpSecurityAttributes,NULL时,句柄不能被继承。
DWORDdwCreationDisposition, CREATE_ALWAYS:总是创建新的。CREATE_NEW:存在时,失败。OPEN_ALWAYS:不存在时,创建一个新的。OPEN_EXISTING:不存在时,失败。
DWORDdwFlagsAndAttributes,一般用FILE_ATTRIBUTE_NORMAL就够了。
HANDLEhTemplateFileNULL
);
对这种打开、操作、关闭三步骤方式的对象,一般都会在打开时指定各种属性,且这些属性仅会保留到关闭前。
创建路径用:CreateDirectory、CreateDirectoryEx
什么是文件一直保留的属性:截图如下。关心的属性:大小、时间。
什么是文件打开后才有的属性:
以下属性作用域:文件打开到关闭。即打开时指定,关闭时消失。
文件指针属性、共享属性、访问属性、创建属性、文件标识和属性、安全属性。前四个比较重要。File pointer是一个可以更改的值,在读写数据时可通过设置其值来改变读写位置。
2、WriteFile和ReadFile
2-1、WriteFile
<作用>写数据到文件指针指定的位置。同步异步都行。WriteFileEx仅支持异步操作。
<返回值>成功返回非0,失败返回0。
<参数介绍>
BOOL WriteFile(
HANDLE hFile,GENERIC_WRITE方式访问的句柄。对异步写:是以FILE_FLAG_OVERLAPPED文件标识打开的句柄,或由socket或accept返回的套接字句柄。
LPCVOID lpBuffer,写数据缓冲区
DWORD nNumberOfBytesToWrite,要写入的字节大小
LPDWORD lpNumberOfBytesWritten,[out]已写入多少字节。若lpOverlapped为NULL,则此参数不能为NULL;lpOverlapped非NULL时,此参数才可为NULL。若是overlapped write操作,可通过GetOverlappedResult获得已写入字节。若hFile和I/O completion port关联,通过GetQueuedCompletionStatus获取已写入字节大小
LPOVERLAPPED lpOverlappedhFile以FILE_FLAG_OVERLAPPED文件标识打开时才需要此属性。以FILE_FLAG_OVERLAPPED打开的hFile,lpOverlapped必须不为NULL。具体到完成端口再讲。
);
2-2、ReadFile
<作用>从文件指针指定位置开始读数据。同步异步都行。ReadFileEx仅用于异步操作。
<返回值>成功返回非0,不成功返回0。若返回值非0,但读到的字节是0,说明读发生时,文件指针在文件结尾。以下任意一种情况发生时,ReadFile才返回:
Ø 管道写入完毕后,会通知你写操作完成。
Ø 请求的字节已读到。
Ø 发生错误。
<参数介绍>
BOOL ReadFile(
HANDLE hFile,GENERIC_READ方式访问的句柄。对异步读:是以FILE_FLAG_OVERLAPPED文件标识打开的句柄,或由socket或accept返回的套接字句柄。
LPVOID lpBuffer,[out]接受数据的buffer
DWORD nNumberOfBytesToRead,要读的字节大小
LPDWORD lpNumberOfBytesRead,[out]已读取的字节。Overlapped不讲了。
LPOVERLAPPED lpOverlapped不讲了。
);
2-3、FlushFileBuffers
<作用>将缓存中数据写入文件。
<返回值>成功非0,失败0。句柄是console output时,失败,因控制台输出没有缓存。
<参数介绍>
BOOL FlushFileBuffers(
HANDLE hFile GENERIC_WRITE方式访问的句柄。
);
对一个不支持缓存的I/O设备,调用CreateFile时应以FILE_FLAG_NO_BUFFERING文件标志打开。
2-4、SetFilepointer /*typedefunsigned long DWORD;*/
<作用>对已打开的文件,移动其指针。文件指针比LONG大时,使用SetFilePointerEx更简单。
<返回值>①成功且lpDistanceToMoveHigh为NULL,则返回值是文件指针(DWORD类型)的低位。②lpDistanceToMoveHigh非NULL,返回值是文件指针的低位,高位存放在lpDistanceToMoveHigh中。③失败且lpDistanceToMoveHigh为NULL,返回值是INVALID_SET_FILE_POINTER。④失败且lpDistanceToMoveHigh非NULL,返回值是INVALID_SET_FILE_POINTER。⑤若新的文件指针是负数,则函数失败,GetLastError返回ERROR_NEGATIVE_SEEK。
<参数介绍>
DWORD SetFilePointer(
HANDLE hFile, GENERIC_READ或GENERIC_WRITE方式访问的句柄。
LONG lDistanceToMove,[in,out]文件指针要移动的低位长度,有正负号。
PLONG lpDistanceToMoveHigh, 文件指针距离头或尾的高位长度,32位够用时,此值设为NULL。
DWORD dwMoveMethod文件指针的起始位置:FILE_BEGIN、FILE_CURRENT或FILE_END。
);
2-5、SetEndOfFile
<作用>移动文件的结尾位置到当前文件指针所在位置。可以通过此函数来截断或扩展设置文件大小。若增大文件,则旧的EOF position和新的结束位置之间的内容未定义。这个是设置文件的物理结束位置,设置逻辑结束位置,使用SetFileValidData。
<返回值>成功非0,失败0。
<参数介绍>
BOOL SetEndOfFile(
HANDLE hFileGENERIC_WRITE方式访问的文件句柄。
);
3、CloseHandle可关闭文件句柄。