这几天,工作中需要从远端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信息。

—————————————————————————-
— getfiles.bat
—————————————————————————-

@echo off

rem /
rem // guanzhong 2006-1-25
rem // Blog : http://blog.csdn.net/guanzhongs
rem // batch file for download file(s) from remote server
rem // Command line :
rem // getfiles <server> <user> <password> <remotefilename>
rem /

if “%1″==”” goto Usage
if “%1″==”/?” goto Usage
if “%2″==”” goto Usage
if “%3″==”” goto Usage
if “%4″==”” goto Usage

set ftpfile=getfiles.tmp
set logfile=getfiles.log

rem // 生成ftp下载脚本

echo open %1 > “%ftpfile%”
echo user %2 %3 >> “%ftpfile%”
echo bin >> “%ftpfile%”
echo prompt >> “%ftpfile%”
echo mget %4 >> “%ftpfile%”
echo quit >> “%ftpfile%”

rem // 记录log

echo ——————————– >> “%logfile%”
date /t >> “%logfile%”
time /t >> “%logfile%”
echo ——————————– >> “%logfile%”

rem // 下载文件
ftp -n < “%ftpfile%” >> “%logfile%”

rem // 删除临时脚本
del “%ftpfile%”

echo getfiles done! >> “%logfile%”

goto End

:Usage
echo Get file(s) from the remote server, support multi get.
echo Usage:
echo getfiles [server user password remotefilename]

: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命令的使用。