Windows 下载文件并检查文件类型的Perl脚本
我想做的很简单: 1) 从硬编码的URL下载文件(它将始终保持不变) 2) 检查文件是否真的是PDF(我认为最好检查神奇的数字%PDF) 3) 如果是,请重命名文件并移动到文件夹xy | |;如果不是,请相应地重命名 注意:这是在Windows 7系统上运行所必需的 这是我的密码:Windows 下载文件并检查文件类型的Perl脚本,windows,perl,pdf,file-type,Windows,Perl,Pdf,File Type,我想做的很简单: 1) 从硬编码的URL下载文件(它将始终保持不变) 2) 检查文件是否真的是PDF(我认为最好检查神奇的数字%PDF) 3) 如果是,请重命名文件并移动到文件夹xy | |;如果不是,请相应地重命名 注意:这是在Windows 7系统上运行所必需的 这是我的密码: #!/usr/bin/perl use warnings; use strict; use LWP::Simple; use POSIX qw( strftime ); use File::Copy; use Fil
#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use POSIX qw( strftime );
use File::Copy;
use File::Type;
my $date = strftime("%m/%d/%Y", localtime);
my $url = "http://www.oracle.com/technetwork/database/options"
."/advanced-analytics/r-enterprise/ore-reference-manual-1882822.pdf";
my $dlfile = "Test.pdf";
my $resp = '';
my $srcdir = "C:\\pdfscripthome";
my $dest = "C:\\pdfdump";
my $old = "$srcdir/$dlfile";
$resp = getstore( $url, $dlfile );
sub CheckFileType {
my $chkfile="$srcdir//Test.pdf";
my $ft = File::Type->new();
my $file_type = $ft->mime_type($chkfile);
if ( $file_type eq 'application/pdf' ) {
move( $old, $dest ) or die "Move $old -> $dest failed: $!";
}
else {
rename ("//$srcdir/Test.pdf", "//$srcdir/NotAValidPDFFile.pdf" )
|| die ("Error in renaming");
}
}
sub main{
&CheckFileType();
}
&main;
当我尝试执行时,什么都没有发生。奇怪的是,当我评论
use File::Type;
它会下载文件(当然不会进行检查)
我假设
子检查文件类型{}
中的某个地方有错误,但我看不到它。我使用草莓Perl v5.20.2在Windows 7上成功地执行了您的Perl程序(没有更改)
我很想提出一些更改,但我决定提供一个简单的更改,它将使您的程序成功完成
在第25行对mime_type()
的调用中,将参数$chkfile
替换为$dlfile
。这将导致mime_type()
在第16行调用getstore()
时查找存储的文件,其中$dlfile
作为指定文件名的参数传递
第25行(原件):
第25行(包含建议的变更):
在没有更改的情况下,Perl程序首先将相对于用户当前工作目录下载的PDF文件存储为文件名\Test.PDF
,然后期望使用绝对路径C:\pdfscript home\Test.PDF
查找PDF文件
如果用户的当前工作目录是
C:\pdfscript home
,则程序成功。如果用户的当前工作目录不是C:\pdfscripthome
,程序将失败,因为调用mime\u type()
时传递的参数包含绝对路径C:\pdfscripthome\Test.pdf
我没有使用perl处理文件,但在脚本的上半部分使用反斜杠,在sub中,您在文件路径中使用普通斜杠。你确定它是这样工作的吗?到目前为止,它在其他脚本中工作。据我所知,在描述完整路径(C:\\etc\etc)时,必须使用windows格式。否则,当您使用变量作为路径时,它必须是Unix格式。@Bifrost和OP:在Windows上使用目录分隔符是错误的。就Windows API而言,“C:\\this\\that\\other”
和“C:/this/that/other”
是同一个。但是,如果路径要通过shell或成为另一个程序的命令行参数,则必须小心。使用File::Spec
,或者更好的方法是使用Path::Class
来正确处理路径。最好停止假装正在编写C,并删除main
子例程。您也不应该使用符号和&
调用Perl子例程:自从22年前Perl 4以来,这是不必要的。现在,它只是提供了一种特殊的方式来调用不应该公开执行的子例程places@SinanÜnür:你肯定是指Perl,而不是WIndows API?我从未能够将使用前斜杠作为分隔符的路径字符串传递给任何可以被称为Windows API函数的对象。谢谢您的帮助。遗憾的是,这在我的机器上仍然不起作用。我的perl版本是5.18,因此我将更新并重试。发生的情况是:DOS窗口打开2秒钟,然后关闭。
my $file_type = $ft->mime_type($chkfile);
my $file_type = $ft->mime_type($dlfile);