更新ファイルのアップロード

作成日: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手習い > 更新ファイルのアップロード


MARUYAMA Satosi