3.1 文件
在Windows下文件有很多种,比如图片文件、视频文件、音频文件……除了常见的文件格式外,其实对于管道、邮槽,甚至是设备对象,在Windows下也被当做文件来对待,这样对于我们操作管道、邮槽、设备对象就像操作文件一样简单了。
对于操作任何文件,我们最先的操作是对文件的打开,操作结束时为了释放资源要进行关闭。我们依次学习如何使用这些API函数,然后完成一个简单的小例子。从“文件操作”开始,我们要接触MFC方面的编程,但不会很难,都是一些对界面和控件之类的使用。
3.1.1 打开文件
要对文件进行操作,就要首先对文件进行打开操作,文件打开成功会返回一个句柄,然后通过这个句柄对文件进行读写操作。
打开文件的API函数如下定义:
参数说明如下。
(1) lpFileName:要打开或创建的文件名。这里也可以不是文件名,可以是管道名、设备对象名。
(2) dwDesiredAccess:对文件的访问模式,通常是GENERIC_READ和GENERIC_WRITE。
(3) dwShareMode:对文件的共享模式。Windows是多进程的操作系统,在一个文件被访问时,可能会有另一个进程也访问该文件。这时第一个打开该文件的进程就要对其设置一个访问模式,即打开此文件后,其他进程对该文件可以有哪些操作。
(4) lpSecurityAttributes:安全属性,一般为NULL。
(5) dwCreationDisposition:在创建或打开的文件存在或不存在时该函数的处理方式。
(6) dwFlagsAndAttributes:打开或创建文件时的标志和属性。一般是FILE_ATTRIBUTE_NORMAL。
(7) hTemplateFile:文件模板,一般为NULL。
该函数若执行成功,则返回一个文件句柄;若执行失败,则返回INVALID_HANDLE_VALUE。
在对文件使用完毕后,应该对打开的句柄进行关闭以释放资源,关闭句柄的函数如下:
该函数就一个参数,这个参数就是调用CreateFile()函数时的返回值,也就是文件句柄。
3.1.2 文件操作
文件操作的种类有4种,分别是“增、删、改、查”。熟悉数据库操作的读者一定感觉这4种操作是针对数据库的,怎么对于文件的操作也是这4种呢?其实,不单单是对文件的操作,对注册表的操作,对服务的操作,对进程的操作……也都存在着“增、删、改、查”这些操作。还是讨论文件的这4种操作,文件的“增”其实就是“创建”文件,文件的“删”就是“删除”文件,文件的“改”就是对文件的“写”操作,文件的“查”就是对文件的“读”操作。当然了,对于文件的“读操作”分为狭义的和广义的两种。狭义的“读文件”就是读取文件的内容,对于广义的“读文件”来说,可以是读取文件的大小、读取文件的创建时间和修改时间……文件的创建是通过CreateFile()函数来完成的,文件的打开也是通过CreateFile()函数来完成。对于删除文件、写文件、读文件……这些API函数,下面将逐一进行介绍。
删除文件的API函数如下:
该函数的参数就只有一个,而且非常简单,就是要删除的文件的文件名。
文件的读函数如下:
参数说明如下。
(1) hFile:该参数是CreateFile()函数返回的句柄。
(2) lpBuffer:指向一个缓冲区,函数会将从文件中读出的数据保存在该缓冲区中。
(3) nNumberOfBytesToRead:要求读入的字节数,通常情况下是缓冲区的大小。
(4) lpNumberOfBytesRead:该参数是一个指向DWORD类型的变量,用于返回实际读入的字节数。
(5) lpOverlapped:一般设为NULL。
文件的写函数如下:
WriteFile()函数与ReadFile()函数的参数意义基本相同,所不同的是第二个参数,第二个参数仍然指向一个缓冲区,函数会将该缓冲区的内容写入到文件中。
设置文件指针的函数如下:
参数说明如下。
(1) hFile:CreateFile()函数打开文件的句柄。
(2) lDistanceToMove:指定要移动的距离。
(3) lpDistanceToMoveHigh:一个指向LONG型的指针,其保存一个要移动的距离的高32位。
(4) dwMoveMethod:指定移动的起始位置。
创建目录的函数如下:
参数说明如下。
(1) lpPathName:创建目录的目录名称;
(2) lpSecurityAttributes:一般为NULL。
移除目录的函数如下:
该函数的参数指定要移除的目录的目录名。
关于文件操作的函数就简单介绍这么几个,在以后的内容中将继续介绍。文件操作是Windows下编程的重要基础,应用非常广泛,希望读者能掌握以上介绍的函数。