http://blog.csdn.net/guanzhongs/archive/2006/01/26/588876.aspx
http://blog.csdn.net/guanzhongs/archive/2006/01/26/588876.aspx
这几天,工作中需要从远端ftp服务器下载并分析大量数据文件。数据文件的分析没什么可说的,就是字串解析,要说说ftp文件下载。
要下载ftp服务器上的文件,方法有多种,如:
1. 用Socket建立链接,然后按照FTP协议,进行命令字交互,这相当于实现一个小的ftp客户端程序;
2. 用WinSDK中的WinINet, 里面提供了FtpGetFile这样的一系列方法,用于ftp客户端编程;
3. 使用类似CuteFTP这样的客户端软件;
4. 使用控制台ftp命令;
使用cuteftp等软件,需要安装软件不说,还不便于与数据处理程序协调工作,所以不行。剩下三种方法都可以,但前两种,写程序工作量比较大,那就看看最后一个方法:使用控制台ftp命令。
常用的ftp命令有open, user, get, mget, put, quit等,最重要一点,ftp命令(实际上也是一客户端程序)支持命令脚本,也就是他可以根据你设计的脚本进行链接和下载。
一个简单的脚本如下:
—————————-
open theftpserver
user admin 123456
get thefile.dat
quit
—————————-
将这样的脚本保存后(如down.ftp),用ftp命令直接调用即可:
c:\blog\csdn\guanzhongs>ftp -n < down.ftp
这样看来,使用ftp命令,结合Windows的批处理文件,完全可以把文件下载部分解决。
还有一问题:下载的文件名是不确定的,但是ftp命令中需要指定确定的文件名。解决这个问题的方法是,在批处理文件中动态生成ftp脚本文件,然后调用ftp命令执行它。
下面是一个例子,已经在WindowsXP下测试通过。这个例子可以接受服务器名,用户名,用户密码,下载文件名为参数,然后将文件下载到本地目录。同时记录简单的log信息。
—————————————————————————- @echo off rem ///////////////////////////////////////////////////////////////// if "%1"=="" goto Usage set ftpfile=getfiles.tmp rem // 生成ftp下载脚本 echo open %1 > "%ftpfile%" rem // 记录log echo ——————————– >> "%logfile%" rem // 下载文件 rem // 删除临时脚本 echo getfiles done! >> "%logfile%" goto End :Usage :End @echo on —————————————————————————- |
上例中,批处理的第四个参数是所要下载的文件名,这个文件名与dos命令中一样,支持通配符,也就是说,这个批处理文件支持下载批量文件,如:
c:\blog\csdn\guanzhongs>getfiles 127.0.0.1 admin 123456 *.jpg
可以把远程目录下的所有jpg文件下载过来。
另外,上例中ftp脚本文件中多了两行内容:
echo bin >> "%ftpfile%"
echo prompt >> "%ftpfile%"
第一行是指定用二进制方式传输,也可以用ASCII方式;
第二行是指定如果有文件覆盖时,不需要提示,这样就不会打断批处理文件的执行了。
有了这个getfiles.bat文件,在程序中下载文件,只需要ShellExecute一下就行了。
对于Linux系统,思路是类似的,而且Linux系统的Shell功能非常强大,能够实现更加完善的功能。
完成上面工作,你需要了解:
DOS/Window Console命令,及批处理脚本编写。
控制台Ftp命令的使用。