Во-первых, я не рекомендую вот так парсить drweb32.lst
@newlist=();
open(FILELIST, "< drweb32.lst") or die "Can't open '$basedir\\drweb32.lst': $!";
if (defined($line=<FILELIST>))
{
if (uc $line eq "[DRWEBUPDATELIST]\n") {
while(<FILELIST>) {
$record = $_;
if ( $record ne "[DrWebUpdateListEnd]\n" and $record ne "[$version]\n" )
{
($file, $crc) = split(/, /, $record);
chomp $crc;
(@str) = split(//, $file);
if (($str[0] eq '-') or ($str[0] eq '!')) { @newlist = (@newlist, "$record"); }
else
{
$char = $str[1];
if ($char eq '<') { $filetest = substr $file, 6; }
else { $filetest = substr $file, 1; }
}
print $filetest.' '.$crc."\n";
}
}
Вы забываете, например, drwebnet.sys. Если хотите парсить lst, то лучше так:
open FHR, '<'."$dir/drweb32.lst" or die "can't open $dir/drweb32.lst ($!)\n";
while (<FHR>) {
s/\r?\n$//; # remove \r\n, \n
/^\[[\w ]+\]$/ and next;
/^[-]/ and next; #skip delete;
my ( $filename, undef,$crc ) = /^[\+\=\@\!].*?([_a-zA-Z0-9\.\-]+)(\|.+)?[, \t]+([a-fA-F\d]+)?[, \t]*(\d+\.\d+)?/o
or print STDERR "unknown line \"$_\" in lst\n";
next if -f "$dir/$filename" and checkcrc32("$dir/$filename",$crc);
$ret++ unless download("$url/$filename","$dir/$filename",$crc);
print "$url/$filename, $crc\n"; #what try to download
}
close FHR;
Поверьте, в компании DrWeb lst могут поправить совершенно невообразимым способом (:-) я это когда-то сделал) и ваш парсер обломится
Я не стал парсить lst по двум причинам:
1) Мне лень
2) По-моему очень удобно самому рулить обновлением. Вот, представте, что завтра вы не захотите обновлять spiderml, который стоит на 100 станциях. Не удалять же его 100 раз. Просто закомментировали одну строку и всё. Также по-моему совсем необязательно качать файлы с музыкой от DrWeb, справку и пр.
Во-вторых, я заклинаю вас не пересчитывать crc и не подсовывать апдейтеру свой lst. Апдейтер когда-нибудь может и не скушать ваш файл. Кроме того, если файл закачается битым, а вы пересчитали crc и записали его в lst, и, таким образом, положили всю контору в BSOD
*. В моем случае апдейтер просто скажет, что crc не совпадает.
Не смог воспроизвести ошибку с закачкой файла drwtoday.vdb. Может, Вам действительно качать с
http://msk3.drweb.com/pub/drweb/bases.
Сейчас есть мысль для файлов с нулевой длинной
Да, я тоже замечал, что тянется какой-то шлак. Поэтому появился код:
# удаление нулевых файлов
opendir (C_DIR, $basedir);
my @c_files=readdir (C_DIR);
closedir (C_DIR);
foreach my $c_file (@c_files){
if ((-s $basedir.'/'.$c_file) eq 0){
unlink ($basedir.'/'.$c_file)
}
}
* Я не проверял, но в 5-й версии dwprot не должен дать загрузить левый модуль DrWeb.