源代码如下:
void CFtpDlg::OnQuery()
{
CInternetSession* pSession; //定义会话对象指针变量
CFtpConnection* pConnection; //定义连接对象指针变量
CFtpFileFind* pFileFind; //定义文件查询对象指针变量
CString strFileName;
BOOL bContinue; pConnection=NULL; //初始化
pFileFind=NULL; UpdateData(TRUE); // 获得用户的当前输入(服务器名,用户名和口令)
while(m_listFile.GetCount()!=0) m_listFile.DeleteString(0); // 清除列表框的内容 pSession=new CInternetSession( // 创建Internet会话类对象
AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
pConnection=
pSession->GetFtpConnection(m_strFtp,m_strName,m_strPwd);
/* try
{ // 试图建立与指定FTP服务器的连接
pConnection=
pSession->GetFtpConnection(m_strFtp,m_strName,m_strPwd);
} catch (CInternetException* e) {
e->Delete(); // 无法建立连接,进行错误处理
pConnection=NULL;
}
*/
if (pConnection!=NULL)
{
// 创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针
pFileFind=new CFtpFileFind(pConnection);
bContinue=pFileFind->FindFile("*"); // 查找服务器上当前目录的任意文件
if (!bContinue) // 如果一个文件都找不到,结束查找
{
pFileFind->Close();
pFileFind=NULL;
} while (bContinue) // 找到了第一个文件,继续找其它的文件
{
strFileName=pFileFind->GetFileName(); // 获得找到的文件的文件名
// 如果找到的是否目录,将目录名放在括弧中
if (pFileFind->IsDirectory()) strFileName="["+strFileName+"]";
// 将找到的文件或目录名显示在列表框中。
m_listFile.AddString(strFileName);
bContinue=pFileFind->FindNextFile(); // 查找下一个文件
} if (pFileFind!=NULL)
{
pFileFind->Close(); // 结束查询
pFileFind=NULL;
}
} delete pFileFind; // 删除文件查询对象
if (pConnection!=NULL)
{
pConnection->Close();
delete pConnection; // 删除FTP连接对象
}
delete pSession; // 删除Internet 会话对象
}
编译构建都没问题..
运行的时候弹出一个对话框"debug assertion failed!"...
我利用MessageBox判断了一下,是下面两句运行出错..而且是只在第一次执行这些语句时才出错..在弹出的出错对话框中选择忽略的话运行结果还是正确的..
///////////////////////////
strFileName=pFileFind->GetFileName(); // 获得找到的文件的文件名
// 如果找到的是否目录,将目录名放在括弧中
if (pFileFind->IsDirectory()) strFileName="["+strFileName+"]";
// 将找到的文件或目录名显示在列表框中。
////////////////////////
把
bContinue=pFileFind- >FindNextFile();
放到
strFileName=pFileFind- >GetFileName();
之前/////////////////////////////////// CListBox::ResetContent
void ResetContent( );// Removes all items from a list box.
CListBox 类提供了删除所有项的函数。
#include <iostream>
#include <string>
#include <afxmt.h>
#include <afxinet.h>using namespace std;#define APP_NAME "测试文件下载"
#define FTP_SERVER "127.0.0.1"
#define FTP_USER "TEST"
#define FTP_PWD "TEST"void FtpTest();
int main();void FtpTest()
{
CInternetSession *pSession; // 定义会话对象指针变量
CFtpConnection *pConnection; // 定义连接对象指针变量
CFtpFileFind *pFileFind; // 定义文件查询对象指针变量
CString strFileName;
BOOL bContinue;
pSession = NULL;
pConnection = NULL;
pFileFind = NULL;
// 创建Internet会话类对象
pSession = new CInternetSession(APP_NAME);
try
{
pConnection = pSession->GetFtpConnection(FTP_SERVER, FTP_USER, FTP_PWD, 21, FALSE);
}
catch (CException* e)
{
char szException[512] = {0};
e->GetErrorMessage(szException, sizeof(szException));
cout << "Connect to FTP server exception: " << szException << ", exit " << endl;
return ;
}
if(pConnection == NULL)
{
cout << "Connect to FTP SERVER failure, exit" << endl;
return;
}
// 创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针
pFileFind= new CFtpFileFind(pConnection);
// 查找服务器上当前目录的任意文件
bContinue=pFileFind->FindFile("*.*");
bContinue = pFileFind->FindNextFile();
while(bContinue)
{
pFileFind->AssertValid();
// 获得找到的文件的文件名
cout << (LPCTSTR)pFileFind->GetFileName() << endl;
// 如果找到的是否目录,将目录名放在括弧中
if (pFileFind->IsDirectory())
strFileName= "[ "+strFileName+ "] ";
cout << strFileName << endl;
// 查找下一个文件
bContinue=pFileFind->FindNextFile();
} pFileFind->Close();
delete pFileFind;
pFileFind = NULL; pConnection->Close();
delete pConnection;
pConnection = NULL;
pSession->Close();
delete pSession;
pSession = NULL;
}int main()
{
FtpTest();
return 0;
}