刚开始编程的时候,你可能会觉得WindowsAPI是一个非常神奇的万能工具。WindowsAPI是在Windows下开发应用程序的基础知识,但基础并不意味着简单。掌握WindowsAPI来开发程序也是非常困难的。在Windows下,文件有很多种,图片文件、视频文件、音频文件……这些文件都属于以不同存储格式存储在磁盘上的文件。除了常见的磁盘文件格式外,管道、邮槽甚至设备对象在Windows下都被视为文件。这样,在编程过程中,操作管道、邮槽、设备对象就如同操作文件一样。1、文件的打开和关闭要对文件进行操作,首先要打开要操作的文件。文件打开成功后,会返回一个可以用来操作文件的句柄,通过这个句柄可以读写文件。打开文件的API函数定义如下:参数说明如下:lpFileName:要打开或创建的文件名,这里的device可以不是目标文件名,可以是作为文件处理的相关对象。dwDesiredAccess:文件的访问方式,指定对打开的对象应该进行什么样的操作。通常为GENERIC_READ和GENERIC_WRITE,分别代表只读模式和只写模式;也可以通过按位或运算符同时指定两种模式,如GENERIC_READ|GENERIC_WRITE。dwShareMode:开启文件的共享模式,表示文件打开后是否允许其他进程操作,如果可以操作,可以指定其操作模式。lpSecurityAttributes:该参数表示安全属性。通过该参数可以指定返回的文件句柄是否可以被子进程继承。如果参数设置为NULL,则表示不能被继承。否则,您需要将参数指向SECURITY_ATTRIBUTES结构。该参数通常为NULL。dwCreationDisposition:创建或打开的文件存在或不存在时本函数的处理方法。dwFlagsAndAttributes:该参数用于指定新建文件的属性以及对该文件进行操作的方式。hTemplateFile:文件模板句柄,系统会将文件模板的所有属性复制到当前创建的文件中。如果函数成功,它返回一个文件句柄;如果失败,则返回INVALID_HANDLE_VALUE。具体失败原因可以通过调用GetLastError()函数获取。文件的打开操作调用了CreateFile()函数,这个函数不像它的名字那样只是用来创建文件的。CreateFile()函数既可以打开文件也可以创建文件。Windows下有OpenFile()函数可以打开文件,但它是Win16的产物,Win32下打开文件必须使用CreateFile()。CreateFile()的参数很多,但习惯后会发现,常用的参数很容易记住,甚至有些参数常用的也就一两个。文件操作完成后,需要关闭打开文件的句柄来释放资源。关闭一个对象句柄的函数非常简单并且被广泛使用。该函数的定义如下:BOOLCloseHandle(HANDLEhObject//handletoobject);该函数只有一个参数,即调用CreateFile()函数时的返回值,即文件句柄。该函数不仅可以关闭文件句柄,还可以通过该函数关闭事件句柄、进程句柄、线程句柄等一系列对象句柄。2、文件操作文件操作有4种,分别是“增、删、改、查”。接触过数据库的读者一定觉得这些操作都是针对数据库的。怎么这四种操作也是对文件进行的呢?实际上,不仅是对文件的操作包括增删改查,还有对注册表、系统服务、进程的操作。只不过有不同的WindowsAPI函数与之对应,而不是使用数据库的SQL语句。以文件操作为例进行说明。文件的“添加”操作可以理解为创建文件,文件的“删除”操作可以理解为删除文件,文件的“修改”操作可以理解为对文件的写操作,而对文件的“查”操作可以理解为文件操作的“读”操作。文件的读写操作可以从狭义和广义上理解。狭义上的“读取文件”是读取打开的文件的内容或数据,而广义上的“读取文件”可以是获取大小、创建时间和修改时间等,因为文件大小、创建时间、修改时间也属于文件的属性,但这些属性并不保存在文件本身中。写操作也是如此。下面介绍常见的文件删除操作和读写操作涉及的API函数。更具体的与文件操作相关的函数无法一一介绍。就靠大家自己去积累和总结了。删除文件的API函数定义如下:BOOLDeleteFile(LPCTSTRlpFileName);这个函数的参数只有一个,lpFileName代表要删除的文件的文件名。大多数文件操作函数都是通过CreateFile()函数返回的文件句柄来操作的,DeleteFile()函数使用的文件名来操作。如果打开了文件,如何删除?读取文件内容的函数如下:HANDLEhFile、LPVOIDlpBuffer、DWORDnNumberOfBytesToRead、LPDWORDlpNumberOfBytesRead、LPOVERLAPPEDlpOverlapped;参数说明如下。hFile:文件句柄,一般为CreateFile()函数返回的句柄。lpBuffer:指向一个缓冲区,函数将在其中保存从文件读取的数据。nNumberOfBytesToRead:要读取的字节数,通常是缓冲区的大小。lpNumberOfBytesRead:指向一个DWORD变量,用于返回实际读取的字节数。lpOverlapped:一般设置为NULL。写入文件内容的函数如下:WriteFile()函数的参数与ReadFile()函数的参数含义基本相同,区别在于第二个参数。第二个参数仍然指向缓冲区,WriteFile()函数将写入缓冲区的内容。使用WriteFile()函数写入文件时,写入的数据通常会被Windows暂时存放在内部缓存中,操作系统会周期性地写入磁盘,以避免频繁的I/O操作影响执行效率。为了保证数据立即写入,可以使用FlushFileBuffers()函数。该函数的定义如下:BOOLFlushFileBuffers(HANDLEhFile);该函数会清除指定文件句柄的缓冲区,以便Windows将缓冲区中的文件写入磁盘。这个函数只有一个参数,文件句柄。此文件句柄与ReadFile()和WriteFile()使用的文件句柄相同。在读写文件时,往往不是从前到后依次读写,而是根据需要读写文件的某一部分,这就需要移动文件指针才能正确读写文件。移动文件指针的函数定义如下:DWORDSetFilePointer(HANDLEhFile,LONGlDistanceToMove,PLONGlpDistanceToMoveHigh,DWORDdwMoveMethod);该函数的参数说明如下。hFile:用于文件操作的文件句柄,如ReadFile()和WriteFile()。lDistanceToMove:指定文件指针移动的距离。lpDistanceToMoveHigh:指向LONG类型的指针,移动距离的高32位,一般为NULL。dwMoveMethod:指定移动的起始位置。您可以从文件开头(FILE_BEGIN)、当前文件位置(FILE_CURRENT)或文件末尾(FILE_END)移动。3、驱动和目录相关操作下面介绍目录相关操作,主要介绍4个相关函数,分别是获取本地所有逻辑驱动器、获取驱动器类型、创建目录、删除目录。下面分别介绍这四个函数的定义。获取所有本地逻辑驱动器的函数定义如下:DWORDGetLogicalDriveStrings(DWORDnBufferLength,LPTSTRlpBuffer);该函数的参数说明如下。nBufferLength:表示lpBuffer的长度。lpBuffer:表示接收本地逻辑驱动器名称的缓冲区。此函数以字符串的形式返回所有可用的本地驱动器名称,并将它们保存在lpBuffer中。返回的字符串形式为"C:\",0,"D:\",0,"E:\",0,0。获取驱动器类型函数定义如下:UINTGetDriveType(LPCTSTRlpRootPathName);该函数只有一个参数lpRootPathName,用于获取逻辑驱动器类型的驱动器名称,如“C:\”。函数返回值采用以下值之一。DRIVE_UNKNOWN:无法识别该驱动器类型;DRIVE_NO_ROOT_DIR:驱动器路径无效;DRIVE_REMOVEABLE:可移动驱动器,如U盘、移动硬盘等;DRIVE_FIXED:不可移动驱动器,指的是硬盘;DRIVE_REMOTE:网络驱动器;DRIVE_CDROM:光驱;DRIVE_RAMDISK:虚拟光驱。创建目录函数定义如下:BOOLCreateDirectory(LPCTSTRlpPathName,LPSECURITY_ATTRIBUTESlpSecurityAttributes);该函数的参数说明如下。lpPathName:创建目录的目录名。lpSecurityAttributes:安全属性,一般设置为NULL。删除目录的函数定义如下:BOOLRemoveDirectory(LPCTSTRlpPathName);该函数的参数指定要删除的目录的目录名。以上是几个常用的关于驱动器和目录的API函数。
