如何检查我是不是在 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 如何检查文件是不是存在于目标目录中