4.3 FTP文件处理
在FTP客户端编程中,用户可以通过一些类或者函数,获得服务器的文件目录和实现上传、下载文件等功能。例如,在MFC中,CSocketFile类和CArchive类是在FTP编程中很重要的两个类。本节将重点介绍这两个类的一些用法和示例。
4.3.1 CSocketFile类的使用
在MFC中定义了一个在套接字编程中使用的类:CSocketFile类;它可以充分发挥CSocket类的特性。CSocketFile类是CFile的派生类,它主要用来在Windows Sockets编程中发送和接收序列化数据(如结构体数据)。通过把CSocketFile类对象、CArchive对象和CSocket创建的套接字对象联系起来,可以实现数据的加载(接收)和存储(发送)。
1.构造函数
在实际编程中,将CSocketFile对象和CSocket对象直接联系起来可以用CSocketFile类的构造函数来完成。CSocketFile类构造函数原型如下:
- CSocketFile::CSocketFile(CSocket* pSocket,
BOOL bArchiveCompatible = TRUE );
参数pSocket是一个CSocket对象;bArchiveCompatible指示该文件对象是否与一个CArchive对象一起使用,默认为true。该构造函数可以有两种调用方式。例如:
- CSocket *m_clientsocket=new CSocket; //创建套接字
- CSocketFile *m_sockfile=new CSocketFile(&m_clientsocket);
- //创建一个与
m_clientsocket关联的文件指针对象
上述代码中,是通过new关键字调用CSocketFile类的构造函数创建一个指针对象的。第二种调用方式如下:
- CSocket *m_clientsocket=new CSocket; //创建套接字
- CSocketFile m_sockfile(&m_clientsocket);
- //创建一个
与m_clientsocket关联的文件对象
这两种调用方式都需要在实例化对象m_sockfile之后,再与CArchive对象相关联,并由CArchive对象指定其属性。属性取值如表4.3所示。代码如下:
- CArchive ar(&m_sockfile, CArchive::load| CArchive::store);
- //创建与m_sockfile相
关联的串行化对象并指定属性- ... //省略部分代码
- ar.Close(); //关闭串行化对象
注意:在这里使用完串行化对象ar以后,需要使用函数CArchive::Close()关闭,确保数据(命令)及时存储(发送)。
2.CSocketFile 与CFile进行比较
CSocketFile类虽然派生于CFile类,但是它却屏蔽掉了函数CFile::Open()。也就是说,用户在实际编程时,不能使用CSocketFile对象直接去调用函数Open()打开文件。
注意:由于在本章实例中,有关文件的操作大多是由CArchive类进行的。因此,关于CSocketFile类的其他函数请参看MSDN,这里不再进行赘述。