更新ファイルのアップロード | 作成日:2000-11-05 最終更新日: |
さて、更新ファイルが列挙できたところで、 いよいよ ftp によるアップロードができるときが来た。
思ったより実行は簡単だった。ファイルの更新を調べる時に、 自分の(ローカルの)サブディレクトリに入ったり親ディレクトリに戻ったりする。 このタイミングでサーバの(リモートの)ディレクトリも一緒に行きつ戻りつすればいい。
上記の点に注意しつつ、ftp の最初と最後だけを正確に記述すれば動作する。 なお、リモートの親ディレクトリに移るのは、"::"ではなく、".."であることに注意する。
# renovigo07.pl
# 2000-11-03
# MARUYAMA Satosi All Rights Reserved.
#
use Net::FTP;
$_ = "tako";
chdir $_;
$ftp = Net::FTP->new("some.host.name");
$ftp->login("anonymous","me@here.there");
$ftp->cwd("/pub");
&dodir(':');
sub dodir {
local($dir,$nlink) = @_;
local($dev,$ino,$mode,$subcount);
# トップレベルでは自分でリンク数を取得しなければならない
($dev,$ino,$mode,$nlink) = stat(':') unless $nlink;
# カレントディレクトリの全ファイルを得る。
opendir(DIR,':') || die "Can't open $dir";
local(@filenames) = readdir(DIR);
closedir(DIR);
if ($nlink == 2) { # このディレクトリにはサブディレクトリはない
for (@filenames) {
next if $_ eq ':';
next if $_ eq '::';
}
}
else { # このディレクトリはサブディレクトリを持っている。
$subcount = $nlink - 2;
for (@filenames) {
next if $_ eq ':';
next if $_ eq '::';
$name = "$dir/$_";
if ((-f $_) && (-M $_ < 1.0)) { # 24 時間以内で変更されたファイルに対して
#print "$name\n";
$ftp->put("$_");
}
next if $subcount == 0; # サブディレクトリをすべて処理したか
# リンク数を得ると共に、ディレクトリであるかをチェックする
($dev,$ino,$mode,$nlink) = lstat($_);
next unless -d _;
chdir $_ || die "Can't cd to $name";
$ftp->cwd("$_");
&dodir($name,$nlink);
chdir '::';
$ftp->cwd("..");
--$subcount;
}
}
}
$ftp->quit;
これで、当初の目的は果たした。
まりんきょ学問所 > perl手習い > 更新ファイルのアップロード