这几天看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可关闭文件句柄。