2011年8月26日 星期五

JNotify 目錄檔案監控

工作需要在linux上做一個檔案監控的功能,本來想法是跑一支排程定時去掃目錄下的檔案,
後來發現在linux (kernel 2.6.13版以上 ) 就有一支deamon叫iNotify提供了這項服務,且也有提供C的API可使用. JNotify即提供Java版本的library,可以很方便的監控檔案的異動.

安裝方式
先到JNotify 官網 http://jnotify.sourceforge.net/ 抓最新版本的檔案,目前為  jnotify-lib-0.93.zip
解開後如下:


這邊注意一下,預設抓完只有libjnotify.so,這是for 32-bit的linux用的,
因此若是64-bit  linux 需要自己build一顆, 或是上網抓別人build好的(底加)
我們需要用的只有libjnotify.so &jnotify-0.93.jar

再來就打開eclipse寫一個測試程式
這邊第二點要注意的是載入libjnotify.so &jnotify-0.93.jar
jnotify-0.93.jar部份比較沒問題,跟一般的jar檔一樣
而libjnotify.so這個讓我搞了很久,若不正確會出現 java.library.path 錯誤
解決方法
1.放到 /usr/lib/ 下 ,
2.後來知道在eclipst中可設定 Native library location 如下圖














這樣就大功告成了!!! 參考官網的範例, 附上測試的程式
Listener.java

import net.contentobjects.jnotify.JNotifyListener;

public class Listener implements JNotifyListener {
@Override
public void fileRenamed(int wd, String rootPath, String oldName,
String newName) {
print("renamed " + rootPath + " : " + oldName + " -> " + newName);
}

@Override
public void fileModified(int wd, String rootPath, String name) {
print("modified " + rootPath + " : " + name);
}

@Override
public void fileDeleted(int wd, String rootPath, String name) {
print("deleted " + rootPath + " : " + name);
}

@Override
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
}

void print(String msg) {
System.err.println(msg);
}
}


Main.java

import net.contentobjects.jnotify.JNotify;
import net.contentobjects.jnotify.JNotifyListener;

public class Main {
public static void main(String[] args)  throws Exception{

System.out.println("Start!");

String path = "/home/rockie/test";

   int mask = JNotify.FILE_CREATED  |
              JNotify.FILE_DELETED  |
              JNotify.FILE_MODIFIED |
              JNotify.FILE_RENAMED;

   // watch subtree?
   boolean watchSubtree = true;

   // add actual watch
   int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
 
   Thread.sleep(1000000);
}
}

結果如下


沒有留言:

張貼留言