Win32::ChangeNotify函式允許程式去監視一個目錄或是目錄樹,程式如下:
一、產生一個Win32::ChangeNotify物件,並且將要監視的目錄與過濾字串(filter string:這個過濾字串包括會觸發通知notification的事件)當作參數傳遞給此物件的建構子。
二、使用wait方法去開啟監視。
三、檢查wait傳回的值看看是否運算的時間已經超過,還是某些「通知」已經顯示。
use Win32::ChangeNotify;
use strict;
my $dir=shift || '.';
die "$dir isn't a directory" unless -d $dir;
my $filter='SIZE ATTRIBUTES';
my $notify=Win32::ChangeNotify->new($dir, undef, $filter);
die "Failed to create ChangeNotify object:$!" unless $notify;
my $status=$notify->wait;
if($status == 1){
print "A change was signalled\n";
}else{
die("A wait error occured:", Win32::FormatMessage(Win32::GetLastError));
}

ChangeNotify事件過濾器的值
ATTRIBUTES:被監視的目錄中檔案屬性有所改變,造成wait返回。
DIR_NAME:被監視的目錄中目錄名稱有所改變,造成wait返回。
FILE_NAME:被監視的目錄中檔案名稱有所改變,造成wait返回。
LAST_WRITE:被監視的目錄中檔案最後修改時間有所改變,造成wait返回。
CHANGE_SECURITY:被監視目錄中安全敘述子有所改變,造成wait返回。
CHANGE_SIZE:被監視目錄中檔案大小有所改變,造成wait返回。
第一個傳給建構子的參數就是我們要監控的目錄。
第二個參數表示是否對子目錄監控。
第三個參數為事件過濾值。
wait方法是從Win32::IPC繼承而來,其傳回值為
+1:這個物件已被通知,表示過濾字串中的某一事件已經發生。
-1:這個物件是個被拋棄的mutex。這表示某一執行緒對mutex件給鎖住,但結束時並沒有解開鎖定,若你看到這樣的情形,表示有錯誤。
0:已經超過你所指定的逾時值,卻沒有任何改變發生。
undef:錯誤已發生。
如果在Win32::ChangeNotify物件已經被通知,而你還想再一次使用它,可以使用reset方法讓此物件作監控的準備工作,之後你可以再次呼叫wait方法。

jck11 發表在 痞客邦 PIXNET 留言(0) 人氣()