【发布时间】:2012-07-25 13:23:14
【问题描述】:
我有两个目录,每个目录都包含图片。区域目录每5分钟更新一次,监视目录每15分钟更新一次。
我要做的是在每个目录中找到最新的文件并获取这些文件并使用 Image Magik 创建第三个图像。
我对某些人有效但非常不一致,例如,当时间与监视文件匹配时,我的代码有时会错过区域文件。
有时它会合并两个监视文件,即使监视文件和区域文件位于两个单独的目录中。
我不知道如何解决它。
这是我的代码:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use vars qw/%files_watch/;
use vars qw/%files_regional/;
sub findNewestFiles {
my $element = $File::Find::name;
return if ( !-f $element );
$files_watch{$element} = ( stat($element) )[10];
$files_regional{$element} = ( stat($element) )[10];
}
my $image_magick_exe = "composite.exe\"";
my $pic_dir = "C:\\eterra\\eterravision\\weather";
my $watch_dir = "C:\\eterra\\eterravision\\weather\\watch";
my $regional_dir = "C:\\eterra\\eterravision\\weather\\regional";
open( OUT, ">>names.txt" ) || die;
find( \&findNewestFiles, $watch_dir );
my $newestfile_watch;
my $time_watch = 0;
while ( my ( $t1, $t2 ) = each(%files_watch) ) {
if ( $t2 > $time_watch ) {
$newestfile_watch = $t1;
$time_watch = $t2;
}
}
$time_watch = localtime($time_watch);
find( \&findNewestFiles, $regional_dir );
my $newestfile_regional;
my $time_regional = 0;
while ( my ( $t3, $t4 ) = each(%files_regional) ) {
if ( $t4 > $time_regional ) {
$newestfile_regional = $t3;
$time_regional = $t4;
}
}
$time_regional = localtime($time_regional);
$newestfile_watch =~ s/\//\\/g;
$newestfile_regional =~ s/\//\\/g; #replacing the "/" in the file path to "\"
my @temp = split( /_/, $newestfile_regional );
my $type = $temp[0];
my $date = $temp[1];
my $time = $temp[2];
my $check = "$pic_dir/radarwatch\_$date\_$time"; #check if file was created
unless ( -e $check )
{
system("\"$image_magick_exe \"$newestfile_regional\" \"$newestfile_watch\" \"$pic_dir\\radarwatch\_$date\_$time\"");
print "file created\n";
}
我将子函数中的 [10] 更改为 [8] 和 [9]。 8是访问时间,9是修改时间,10是创建时间,10是最成功的。
我认为问题出在子函数上。 有没有更好的方法来搜索最新的创建时间?比我拥有的更可靠的东西?
【问题讨论】:
-
你可以写
my ($type, $date, $time) = split( /_/, $newestfile_regional );来避免@temp。您打开了一个OUT句柄,但您没有使用它。一般来说,将问题分解为最小示例是一个好主意。就目前而言,这不是一个真正的问题,而是 fix-my-code 请求本网站的目的不是什么。 -
无论如何,谢谢你,我为错过使用该网站而申请。
-
这是我第一次在这里发帖,所以我不熟悉这里的规则,我做了编辑并提出了一个直接的问题。我觉得应该不错
-
在子 findNewestFiles 中,你统计了同一个文件两次。也许您打算在每个目录中统计一次文件? mtime 应该最适合您的应用程序。名称“findNewestFiles”具有误导性,它在监视目录中查找并存储每个文件的时间,两次。英语对你正在尝试做的事情有点困惑。每隔几分钟就会有一个新文件转储到每个目录中吗?并且您正试图在每个目录中找到要处理的单个最新文件?
标签: perl