後來發現在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);
}
}
結果如下
沒有留言:
張貼留言