如何检查我是不是在 Perl 中下载了整个文件?

Posted

技术标签:

【中文标题】如何检查我是不是在 Perl 中下载了整个文件?【英文标题】:How can I check that I downloaded the entire file in Perl?如何检查我是否在 Perl 中下载了整个文件? 【发布时间】:2010-04-28 12:45:37 【问题描述】:

文件大小的测试在这里有意义吗?我试图在下载时切断连接,但似乎从未达到大小测试。

#!/usr/bin/env perl
use warnings; 
use strict;
use 5.012;
use LWP::Simple;

my $url = 'http://www.kernel.org/pub/linux/kernel/v2.6/next/patch-v2.6.34-rc5-next-20100428.bz2';
my $file = 'next_kernel.bz';
my $file_size = '3462166';

my $response = getstore( $url, $file );
if ( is_success $response ) 
    if ( $file_size == -s $file ) 
        say "OK";
    
    else 
        say "Not OK";
    

【问题讨论】:

有一个错字:'filenmame',但我想这只是在这个 sn-p 中。 为什么要检查文件大小?您是否正在尝试验证文件是否未损坏或其他原因? 我又试了一次,如果我等待的时间足够长,我会得到“不正常”。 是的,由于连接丢失。 【参考方案1】:

如果您只是想练习测试代码,请输入错误的文件大小并断言您的下载不是“OK”。如果您想测试中断连接会发生什么,您需要一个更大的文件——2342 字节的下载应该只需要几分之一秒。

【讨论】:

【参考方案2】:

这很奇怪,我得到了和你一样的结果。我没有解决方案,但我在这里报告了一些针对您的问题的黑客攻击。

发生的情况是保存的文件比预期的要大,并且没有连接中断。尝试 bunzip2 会出错,即使在将生成的文件截断为所需大小后也是如此。

通过将 LWP::UserAgent 和 :content_file 参数用于 get() 方法可以实现完全相同的结果。再次向 $ua 对象添加 response_data 处理程序。

但是下面的命令给了我很好的结果:

GET http://www.kernel.org/pub/linux/kernel/v2.6/next/patch-v2.6.34-rc5-next-20100428.bz2 > next_kernel.bz

由于 GET 是基于 LWP 的 lwp-request 脚本,如果您愿意深入研究,可以通过检查其代码找到答案。

希望对你有所帮助。

【讨论】:

【参考方案3】:

我想这不会有什么坏处,但我相当肯定 is_success 不会在连接中断时返回 true。

【讨论】:

以上是关于如何检查我是不是在 Perl 中下载了整个文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中使用 grep 检查字符串是不是存在 [重复]

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

Perl LWP::Simple::getstore 如何检查文件是不是存在于目标目录中

如何检查 Net::Telnet 会话是不是仍在 Perl 中?

如何在不下载的情况下使用其 URL 检查文件是不是存在?

如何在 Perl 中检查多个变量是不是为空