2

私は 2 つのディレクトリを持っており、それぞれに画像が含まれています。地域ディレクトリは 5 分ごとに更新され、監視ディレクトリは 15 分ごとに更新されます。

私がやろうとしているのは、各ディレクトリで最新のファイルを見つけて、それらのファイルを取得し、Image Magikを使用して 3 番目のイメージを作成することです。

私が持っているものは一部で機能しますが、非常に一貫性がありません。たとえば、時計ファイルと時間が一致すると、コードが地域ファイルを見逃すことがあります。

また、監視ファイルと地域ファイルが 2 つの別々のディレクトリにある場合でも、2 つの監視ファイルをマージする場合があります。

修正方法がわかりません。
これが私のコードです:

#!/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 が最も成功しています。

問題はサブ機能にあると思います。最新の作成時間を検索するより良い方法はありますか? 私が持っているものよりも信頼できるものはありますか?

4

1 に答える 1

0

問題の核心は、各ディレクトリで最新のファイルを見つけて処理することだと思います。それらの処理の詳細はさておき、最新のファイルを見つけるスクリプトを次に示します。すべて process_latest サブルーチンに入れることができる imagemagick のものは省きます。File::Find は必要ありません。File::stat を使用すると、それらの番号を覚えようとする代わりに名前を使用できます。プログラムはより明確な構造を持っています。

use strict;
use warnings;
use File::stat;

my $watch_dir    = "C:\\eterra\\eterravision\\weather\\watch";
my $regional_dir = "C:\\eterra\\eterravision\\weather\\regional";

# get the latest in each directory
my $latest_regional = get_latest_file($regional_dir);
my $latest_watch    = get_latest_file($watch_dir);

# do whatever you want here...
process_latest ($latest_regional, $latest_watch);

# I exit 1 in Windows, exit 0 in Unix
exit 1;

#--------------------------------
# subroutines
#--------------------------------

sub get_latest_file {
    my $dir = shift;
    opendir my $DIR, $dir or die "$dir $!";
    my $latest_time = -1;
    my $latest_file = '';
    FILE:
    while (readdir($DIR)) {
        my $file = "$dir\\$_";
        next FILE unless -f $file;
        my $file_time = stat($file)->mtime;
        print "$file $file_time\n";
        if ($file_time > $latest_time) {
            $latest_time = $file_time;
            $latest_file = $file;
        }
    }
    closedir $DIR;
    return $latest_file;
}

sub process_latest {
    my $regional = shift;
    my $watch    = shift;

    print "Latest Regional: $regional\n";   
    print "Latest Watch:    $watch\n";

}
于 2012-08-05T04:02:05.300 に答える