Skip to Content

用Windows批处理文件封装ftp文件下载

  • strict warning: Non-static method view::load() should not be called statically in /var/www/drupal_module/views/views.module on line 906.
  • strict warning: Declaration of views_handler_filter::options_validate() should be compatible with views_handler::options_validate($form, &$form_state) in /var/www/drupal_module/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter::options_submit() should be compatible with views_handler::options_submit($form, &$form_state) in /var/www/drupal_module/views/handlers/views_handler_filter.inc on line 0.
  • strict warning: Declaration of views_handler_filter_node_status::operator_form() should be compatible with views_handler_filter::operator_form(&$form, &$form_state) in /var/www/drupal_module/views/modules/node/views_handler_filter_node_status.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_validate() should be compatible with views_plugin::options_validate(&$form, &$form_state) in /var/www/drupal_module/views/plugins/views_plugin_row.inc on line 0.
  • strict warning: Declaration of views_plugin_row::options_submit() should be compatible with views_plugin::options_submit(&$form, &$form_state) in /var/www/drupal_module/views/plugins/views_plugin_row.inc on line 0.
  • strict warning: Non-static method view::load() should not be called statically in /var/www/drupal_module/views/views.module on line 906.
  • strict warning: Non-static method view::load() should not be called statically in /var/www/drupal_module/views/views.module on line 906.
  • strict warning: Non-static method view::load() should not be called statically in /var/www/drupal_module/views/views.module on line 906.
  • strict warning: Declaration of views_handler_field_comment::init() should be compatible with views_handler_field::init(&$view, $options) in /var/www/drupal_module/views/modules/comment/views_handler_field_comment.inc on line 0.
  • strict warning: Declaration of views_handler_filter_boolean_operator::value_validate() should be compatible with views_handler_filter::value_validate($form, &$form_state) in /var/www/drupal_module/views/handlers/views_handler_filter_boolean_operator.inc on line 0.

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信息。

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

-- EOF-TRUEVUE --