如何用vc++从ftp上搜索到符合条件的文件并下载? 如题,在ftp上有文件夹的名字假设为aaa,我如何用vc++实现找到它并把它下载到本地磁盘中?建议者均有分,分数不够再加。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用CFtpFileFind和递归算法来遍历ftp目录http://www.vckbase.net/document/viewdoc/?id=734 用FtpFindFirstFile、InternetFindNextFile遍历查找,注意:如果要开始新的查找,必须先InternetCloseHandle关闭前一次查找的句柄。 void Cmfcftp3Dlg::List() { CString m_i; CString m_ii; CStringArray m_Dir; CFtpFileFind finder(m_pFtpConnection); BOOL bWorking=finder.FindFile(_T("*")); while (bWorking) { bWorking = finder.FindNextFile(); if ( finder.IsDots() ) continue; if ( finder.IsHidden() ) continue; if (finder.IsDirectory()) { m_Dir.Add( finder.GetFileName()); } else { m_i=finder.GetFileName()+"\r\n"; m_ftpinfo +=m_i; UpdateData(FALSE); } } finder.Close(); for(int i=0;i<m_Dir.GetSize();i++) { m_i="["+m_Dir.GetAt(i)+"]"+"\r\n"; m_ftpinfo +=m_i; UpdateData(FALSE); m_pFtpConnection->SetCurrentDirectory(m_Dir.GetAt(i)); List(); m_pFtpConnection->SetCurrentDirectory(".."); } } 可以用CFtpConnection,但是我还是喜欢直接用SOCKET写。其实原理不难,用一个SOCKET用于Control,直接发FTP命令即可,如要取文件,先建立一个临时的监听Socket,把这个新建的SOCKET的端口用PORT命令先传过去,然后在原来的SOCKET里发一个RETR aaa命令,之后FTP Server会主动来连接你的监听Socket并发送文件给你。这样的好处是可以自己控制。如果用CFtpConnection的话,一旦遇到不支持SIZE命令的FTP Server,就挂了。可以参考TCP/IP详解一书,第一卷,FTP协议那一章,那章看一半,你就可以写出一个简单的FtpClient了。:) LZ只是想知道怎么找到符合条件的文件吧?如果这个条件在文件名上就能体现的话,直接用FindFile(符合条件的文件名)遍历此目录即可。如果是一些隐藏条件,比如找只读文件:那就遍历所有,挨个取其属性。 有关ComboBox的问题!很着急 谢谢 如何访问远程注册表 控件工具栏不显示已经添加的DataGrid&ADODC控件 如何从位图中快速查找到特定颜色的若干个点? 请问在 vc 编译环境中能不能设置强制函数声明为stdcall方式?谢谢 何谓组件????谁能说清楚?? 请问怎样将对话框中的不同控件层叠放置?(最急!!!) mfc单文档中如何实现所绘的多个图形同时移动 高手请救急! 请问怎样获得或执行文件的版本? 如何得到远程计算机的时间? CString的strlen
使用CFtpFileFind和递归算法来遍历ftp目录
http://www.vckbase.net/document/viewdoc/?id=734
{
CString m_i;
CString m_ii;
CStringArray m_Dir;
CFtpFileFind finder(m_pFtpConnection);
BOOL bWorking=finder.FindFile(_T("*"));
while (bWorking)
{
bWorking = finder.FindNextFile();
if ( finder.IsDots() ) continue;
if ( finder.IsHidden() ) continue;
if (finder.IsDirectory())
{
m_Dir.Add( finder.GetFileName());
}
else
{
m_i=finder.GetFileName()+"\r\n";
m_ftpinfo +=m_i;
UpdateData(FALSE);
}
}
finder.Close();
for(int i=0;i<m_Dir.GetSize();i++)
{
m_i="["+m_Dir.GetAt(i)+"]"+"\r\n";
m_ftpinfo +=m_i;
UpdateData(FALSE);
m_pFtpConnection->SetCurrentDirectory(m_Dir.GetAt(i));
List();
m_pFtpConnection->SetCurrentDirectory("..");
}
}
其实原理不难,用一个SOCKET用于Control,直接发FTP命令即可,如要取文件,先建立一个临时的监听Socket,把这个新建的SOCKET的端口用PORT命令先传过去,然后在原来的SOCKET里发一个RETR aaa命令,之后FTP Server会主动来连接你的监听Socket并发送文件给你。这样的好处是可以自己控制。如果用CFtpConnection的话,一旦遇到不支持SIZE命令的FTP Server,就挂了。
可以参考TCP/IP详解一书,第一卷,FTP协议那一章,那章看一半,你就可以写出一个简单的FtpClient了。:)
如果这个条件在文件名上就能体现的话,直接用FindFile(符合条件的文件名)遍历此目录即可。
如果是一些隐藏条件,比如找只读文件:那就遍历所有,挨个取其属性。