|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Stas Vlasov 2:5080/172 16 Mar 2002 00:42:09 To : All Subject : Hекоторые ошибки -------------------------------------------------------------------------------- Есть скрипт, который вобщем-то неплохо работает, производит что-то подобное ls -lr на заданном ftp. Hо, вероятно, при превышении некоторого количества файлов на фтп (каждый раз разного) сообщает об ошибке в одном и том же месте (подчеркнуто) и прекращает рекурсию, сообщая по всем оставшимся подкаталогам корня ту же самую ошибку. Содержимое $! в момент возникновения ошибки - либо пустое, либо 'Bad file number' Вопрос: что это могло бы быть и как этого избежать? Вот собственно скрипт: ========== #!perl use strict; use DBI; use Net::FTP; sub update_files; sub dir_list; my ($driver, $database, $hostname, $user, $password, $dbh, $dsn, $drh, $sth, $date, $cdate, $server_date, $url, $status, $query, $ftp, $server, %exclude, $k, $url_); $url = $ARGV[0]; if (!(defined $url)) { printf "usage: update_url.pl ftp://url"; } $driver = "mysql"; $database = "ftpsearch"; $hostname = "localhost"; $dsn = "DBI:$driver:database=$database;host=$hostname"; $user = "ftpuser"; $password = ""; $dbh = DBI->connect($dsn, $user, $password); if (!(defined $dbh)) {die "Can't connect to database\n"} $drh = DBI->install_driver("mysql"); #Выборка урлов-исключений $sth = $dbh->prepare("SELECT * FROM excludes"); $sth->execute(); while ($url_ = $sth->fetchrow_arrayref) { $exclude{$$url_[0]} = 1; } $date = sprintf "%04d%02d%02d", (localtime(time))[5] + 1900, (localtime(time))[4] + 1, (localtime(time))[3]; $cdate = sprintf "%04d-%02d-%02d", (localtime(time))[5] + 1900, (localtime(time))[4] + 1, (localtime(time))[3]; #$cdate = "2002-02-12"; $status = ""; printf "DELETE FROM files WHERE file LIKE \"%s\%\";\n", $url; update_files($url); $dbh->disconnect(); printf "UPDATE ftpservers SET url = \"%s\", lastcheck = \"%s\", status = \"%s\" WHERE url = \"%s\";\n", $url, $cdate, $status, $url; sub update_files { my ($arg, @arg, $dir); $arg = $_[0]; $arg =~ s/^ftp:\/\///; @arg = split '/', $arg; $server = $arg[0]; $ftp = Net::FTP->new($server, Debug => 0) || die "Can't create ftp object\n"; $ftp->login("anonymous",'f172@mail.ur.ru') || return; dirlist($dir); $ftp->quit; } sub dirlist { my ($d, $i, @res, $line, $path); my ($perm, $size, $mon, $day, $ytime, $fname, $dir, $cdir, $res); $d = @_[0]; $cdir = $d; if ($d =~ /^\/$/) { $cdir = "" }; if (!($ftp->cwd($d))) {warn "Can't chdir to $d - $!\n"; return}; #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @res = $ftp->dir; for ($i = 0; $i <= $#res; $i++) { $line = $res[$i]; $line =~ /^(.{10})\s+\d+\s+[0-9a-z]+\s+[0-9a-z]+\s+(\d+)\s+(.+)\s+(\d{1,2})\s+([0-9\:]+) \s+(.+)$/; $perm = $1; $size = $2; $mon = $3; $day = $4; $ytime = $5; $fname = $6; if (($fname =~ /^$/) || ($fname =~ /^\.$/) || ($fname =~ /^\..$/)) {next;} if ($perm =~ /^d/) { if (defined $exclude{$fname}) {next}; $path = sprintf "ftp://$server$cdir/$fname"; printf "INSERT INTO files VALUES (\"%s\", %s, %s,\"%s\", \"%s\");\n", $path, $size, $day, $mon, $ytime; $dir = "$cdir/$fname"; if (defined $exclude{$path}) { next; } else { dirlist($dir); } } else { $path = sprintf "ftp://$server$cdir/$fname"; printf "INSERT INTO files VALUES (\"%s\", %s, %s, \"%s\", \"%s\");\n", $path, $size, $day, $mon, $ytime; } } } ========== Good luck. Stas --- Еще одно "золото" 3.0.1 * Origin: gui is good, but console better (2:5080/172) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/22873c928702.html, оценка из 5, голосов 10
|