2014-05-07 72 views
0

我一直在嘗試創建一個perl腳本來監視文件夾以創建任何新的子文件夾,並且必須將其複製到新的位置。perl - 監視器文件夾,並等待更改完成

直到現在我能夠拿出下面的代碼。我可以監控和caputure新創建的文件夾,但我不知道如何等待,直到所有子文件夾/文件都創建在這個新創建的文件夾下。

我當前的代碼是

use warnings; 
use strict; 
use Linux::Inotify2; 
use File::Copy::Recursive qw(dircopy); 

    my $target = "/home/Interface/tmp"; 

    print STDERR "Watching $target...\n"; 

    my $in2 = Linux::Inotify2->new(); 
    die "Inotify2: $!" if (! defined $in2); 

    $in2->watch ($target, IN_CREATE) or die "watch: $!"; 

#### Need to do Something here to wait untill IN_CREATE EVENT finishes fully####### 

    while (1) { 
    foreach my $watchdog ($in2->read()) { 
      print "$watchdog->{name}\n "; 
      caputure_event($watchdog); 
     } 
    } 

sub caputure_event 
{ 
    my ($itemlist) = @_; 
    my $itemlistPath = $itemlist->fullname; 
    my $itemlistID = $itemlist->{name}; 


    copyfile($itemlistPath,$itemlistID); 
    $itemlistPath = ""; 
} 


sub copyfile 
{ 

    my ($sourcedir,$itemlistName) = @_; 
    my $targetparentdir = "/home/Interface/Input"; 
    my $targetdir = "$targetparentdir/$itemlistName"; 
    dircopy("$sourcedir", "$targetdir"); 

} 

我的問題是,新目錄下創建的所有文件之前copyfile功能得到執行。我想獲得專家意見來解決這個問題。我可以使用sleep函數,但不要認爲這很有效。

+0

嗨!我之前問過這個問題:http://stackoverflow.com/questions/21476798/using-win32changenotify-and-waiting-for-the-operation-to-complete它是用於Win32,但該解決方案也適用於你。 – capfan

+0

@capfan這不是一個壞主意,但我的問題是有多個文件和文件數量根據不同的使用情況而有所不同。我在想這裏的其他東西......因爲你想到了一些其他的想法,請分享它。 thx – user2190101

+0

您可以定期檢查文件夾內所有文件的更改。這是一項昂貴的操作,但由於操作系統確實(可能)不提供此信息,因此可能是您唯一的機會。請記住,對於網絡副本,可能是最後更改的信息可能不可靠。 – capfan

回答

0

我想出了一個下面的解決方案,它似乎爲我工作。

我一直在監視一個文件夾的任何更改(使用iNotify2),並分別進行跟蹤,經過預定義的時間間隔後,我使用單獨的進程爲這些新創建的子文件夾執行我的任務。