用于将修改后的文件上传到 FTP 服务器的 Perl 脚本
一个简单的 Perl 脚本,它使用本地 MS-Access 数据库存储文件的修改日期,并将修改后的文件上传到 FTP 服务器
引言
将文件从本地 PC 上传到远程 FTP 服务器时,我遇到了一个问题:需要上传大量文件,但只有少数文件实际发生了更改。
因此,我决定比较本地文件和远程文件的修改时间戳。理论上,文件只需要在以下情况下上传:
- 本地修改日期晚于远程修改日期,或
- 远程文件根本不存在
实际上,问题在于 FTP 服务器有不同的时间基准(例如,它的时钟比本地时钟快或慢几秒),因此比较可能会失败。
上传算法
本文提出的解决方案通过将要上传的文件的修改时间戳存储在本地数据库中,并与这些时间戳进行比较来解决此问题。
简而言之,“算法”对于要上传的每个文件的工作方式如下:
- 数据库中是否存在该文件的条目?
- 如果否,则上传它,为该文件创建一个新的
recordset
,存储其路径和修改日期。 - 如果是,请将文件的实际修改日期与数据库中存储的修改日期进行比较。
- 如果实际修改日期晚于存储的日期,则上传文件,并将修改日期存储在数据库中。
- 如果实际修改日期早于存储的日期,则什么也不做。
缺点是,脚本首次运行时,数据库是空的,因此它会一次性上传所有文件,即使它们可能已经存在于远程 FTP 服务器上。
从第二次开始执行脚本,它将按上述方式工作。
脚本安装
您必须已安装 ActiveState 的 Windows 版 Perl。在撰写本文时,我始终使用最新版本,即 ActivePerl 5.6。
此外,我使用了一些 Perl 标准分发版中不包含的模块。这些模块可以从 CPAN 获得,网址是 www.cpan.org。
需要安装以下附加模块:
- libnet (libnet-1.0703.tar.gz)
- TimeDate, (TimeDate-1.10.tar.gz)
- Date-Calc (Date-Calc-4.3.tar.gz) 对我来说安装不成功。因此我使用了 Date-Pcalc 模块 (Date-Pcalc-1.1.tar.gz)
每个模块都包含一个readme文件,其中说明了如何安装。
脚本配置
安装了 Perl 和所有模块后,您需要配置脚本。
必须配置以下值:
值 | 描述 | 示例 |
$ftp_server | 远程 FTP 服务器的地址(IP 或名称) | "ftp.codeproject.com" |
$ftp_dir | 远程 FTP 服务器上的子目录。末尾不要使用斜杠 | "/download/files" |
$ftp_uid | 登录 FTP 服务器的帐户的用户名(用户 ID) | "chris" |
$ftp_pw | 登录 FTP 服务器的帐户的密码 | "maunder" |
@src_dir | 要上传的目录数组。给定的每个目录都将递归处理(即,子目录也将被处理)。 | ("c:\mywebsite") |
@wc_exclude | 用于匹配以排除文件或目录的子字符串数组。对于每个找到的文件(即其完整路径),都会执行子字符串匹配,然后仅当未找到任何项目时,才会处理该文件或目录。 | ("_vti",".mdb","\\bak","\\data","server.inc") |
$db_connstr | 连接到数据库的 ADO 连接字符串。您可以在此处使用任何有效的表达式,例如 OLE-DB 字符串或 ODBC 字符串。 | "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=\\\\thisismyserver\\dir\\dir\\dir\\upload.mdb" |
$db_uid | 连接到数据库的帐户的用户名。通常此字段为空。 | "" |
$db_pw | 连接到数据库的帐户的密码。通常此字段为空。 | "" |
脚本执行
配置完所有内容后,只需在资源管理器中双击该脚本即可执行,或在命令提示符下键入“perl upload.pl
”。
脚本会将输出写入 stdout
以及名为“upload.log”的日志文件。
结语
如果您有任何建议、发现错误或想就本文或脚本发表评论,请在本篇文章末尾撰写评论,我将回复。
请记住,我现在才开始学习 Perl 几个月。因此,我的脚本中可能有很多“不那么优美”的代码片段。所以,如果您对我编码风格或 Perl 使用方式有任何建设性的意见,请告诉我!