这几天搞的东东。。。。[转载]

本文讨论在Evc下遍历ftp站点的文件并下载,google了很多天,找到相关资料,但在evc下应用的很少,此文总结方法并应用到evc,以共享。

      ftp站点的访问有很多方法,本文使用InternetOpen,InternetConnect两函数来连接,因在evc环境下并不支持CFtpFileFind类,可用FtpFindFirstFile,InternetFindNextFile来遍历文件夹,用FtpGetFile下载文件,此方法是win API函数,在多种windows开发平台上都可以使用。

      这几个函数的结合在google上可以轻易搜索到,在此介绍下此次开发过程中遇到的问题:

1 关于evc下遍历文件夹的方法

    vc下遍历ftp文件夹的方法很简单,又专门的类CFtpFileFind,通过此类可直接查找文件,但是evc下不支持这个类的使用。在windows遍历文件夹使用FindFirstFile和FindNextFile,此方法可访问本地和局域网的文件夹,如访问:”\\192.168.1.230\Share“,注意此时的文件夹中的斜杠的数量,必须是这种格式的,但此方法无法访问远程的ftp站点,最终找到FtpFindFirstFile,InternetFindNextFile结合的方法,可以使用;

2 使用FtpFindFirstFile,InternetFindNextFile查找的文件夹类型

     ftp站点下的每个文件夹下都有两个文件夹”.”和”..”存在,”.”代表本目录路径,”..”代表上一级路径,所以在搜索到文件夹时需做判断排除此文件夹。

3 使用FtpFindFirstFile后无法用InternetFindNextFile继续查找下一个文件或文件夹

     在使用函数InternetOpen(_T(“ftp”),INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0)时注意参数设置,起初我最后一个参数使用了INTERNET_FLAG_ASYNC,MSDN上的解释是Makes only asynchronous requests on handles descended from the handle returned from this function. Only the InternetOpen function uses this flag. 我尚未弄清该参数的具体意义,起初使用是参考其他网友的版本,大家可研究下。还有注意的是第一个参数不能为NULL,否则open出错。

4 使用FtpFindFirstFile查询后,发现文件夹遍历进入后,再搜索时发现FtpFindFirstFile的返回值为0

      在这里要注意的是,在进入下一级文件夹后,必须先调用InternetCloseHandle(hFind)!!!否则结果就像上面描述的那样了,返回0。

      这样使用后,会存在递归调用下载的问题,因为程序逻辑是,如果发现文件夹即递归进入,之前的hFind已经被关闭,这样递归返回后,其余文件无法下载了,所以此处采用的方法是,在递归发现文件夹后把文件夹名保存,下载此目录下的其他文件,全部完毕后,再调用文件夹名递归进入下一级文件夹,这样之前的hFind被关闭后也不存在返回的问题了。