源代码如下:
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+"]";
// 将找到的文件或目录名显示在列表框中。
////////////////////////

解决方案 »

  1.   



      bContinue=pFileFind- >FindNextFile();
    放到
      strFileName=pFileFind- >GetFileName();
    之前/////////////////////////////////// CListBox::ResetContent 
    void ResetContent( );// Removes all items from a list box.
    CListBox 类提供了删除所有项的函数。
      

  2.   


    #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;
    }