<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 59, comments - 244, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    java實(shí)現(xiàn)文件監(jiān)控

    Posted on 2011-01-09 16:32 penngo 閱讀(14525) 評(píng)論(10)  編輯  收藏 所屬分類: Java

    java本身不能直接監(jiān)聽(tīng)系統(tǒng)的文件操作事件,不過(guò)可以先編寫C/C++調(diào)用操作系統(tǒng)的API監(jiān)聽(tīng)文件,再通過(guò)jni調(diào)用的方式實(shí)現(xiàn)。限于本人的C/C++水平有限,沒(méi)有用C/C++實(shí)現(xiàn)該接口,而且已有開(kāi)源組件JNotify實(shí)現(xiàn)了這個(gè)功能,本文例子使用JNotify。

    public class MainFrame extends JFrame {

        
    private JPanel contentPane;
        
    private JTextField textField;
        
    private JTextArea textArea;

        
    public static void main(String[] args) {
            EventQueue.invokeLater(
    new Runnable() {
                
    public void run() {
                    
    try {
                        MainFrame frame 
    = new MainFrame();
                        frame.setVisible(
    true);
                    } 
    catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        
    public MainFrame() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(
    100100543300);
            contentPane 
    = new JPanel();
            contentPane.setBorder(
    new EmptyBorder(5555));
            setContentPane(contentPane);
            contentPane.setLayout(
    null);

            JLabel label 
    = new JLabel("監(jiān)控路徑:");
            label.setBounds(
    33206515);
            contentPane.add(label);

            textField 
    = new JTextField("D:/");
            textField.setBounds(
    901621921);
            contentPane.add(textField);
            textField.setColumns(
    10);

            JButton button 
    = new JButton("開(kāi)始監(jiān)控");
            button.addActionListener(
    new ActionListener() {
                
    public void actionPerformed(ActionEvent e) {
                    
    try {
                        addWatch();
                    } 
    catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
            button.setBounds(
    319169323);
            contentPane.add(button);

            textArea 
    = new JTextArea();
            JScrollPane scrollPane 
    = new JScrollPane(textArea);
            scrollPane.setBounds(
    3345480207);
            contentPane.add(scrollPane);
        }

        
    public void addWatch() throws Exception {
            String path 
    = textField.getText();
            
    int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED
                    
    | JNotify.FILE_MODIFIED | JNotify.FILE_RENAMED;
            
    boolean watchSubtree = true;
            
    //添加文件監(jiān)聽(tīng)
            int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
        }

        
    class Listener implements JNotifyListener {
            
    public void fileRenamed(int wd, String rootPath, String oldName,
                    String newName) {
                textArea.append(
    "文件:" + rootPath + " : " + oldName + " 重命名為: "
                        
    + newName + "\n");
            }

            
    public void fileModified(int wd, String rootPath, String name) {
                textArea.append(
    "文件修改 " + rootPath + " : " + name + "\n");
            }

            
    public void fileDeleted(int wd, String rootPath, String name) {
                textArea.append(
    "刪除文件: " + rootPath + " : " + name + "\n");
            }

            
    public void fileCreated(int wd, String rootPath, String name) {
                textArea.append(
    "新建文件: " + rootPath + " : " + name + "\n");
            }
        }
    }

    運(yùn)行效果:
    在D盤新建一個(gè)文件和修改文件名操作。
    http://m.tkk7.com/pengo

    附件:源碼

    評(píng)論

    # re: java實(shí)現(xiàn)文件監(jiān)控[未登錄](méi)  回復(fù)  更多評(píng)論   

    2011-01-10 23:35 by semmy
    無(wú)法監(jiān)控到打開(kāi)文件和文件夾,只能監(jiān)控到增、刪、改。

    # re: java實(shí)現(xiàn)文件監(jiān)控[未登錄](méi)  回復(fù)  更多評(píng)論   

    2011-01-10 23:40 by semmy
    不知道有沒(méi)有辦法監(jiān)控到打開(kāi)文件

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2011-01-11 00:32 by pengo
    JNotify現(xiàn)在的版本是沒(méi)有監(jiān)控打開(kāi)文件,如果你用的是window系統(tǒng),可以查下window api,看看有監(jiān)控文件打開(kāi)的API,有的話用C/C++寫好編譯成DLL,再用通過(guò)java的jni或jna調(diào)用就行了。

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2011-01-13 11:16 by nihao
    我在使用JNotify的時(shí)候發(fā)現(xiàn)
    創(chuàng)建一個(gè)文件會(huì)同時(shí)觸發(fā)一個(gè)Create事件和3-4個(gè)Modify事件
    重命名一個(gè)文件的時(shí)候也同時(shí)出發(fā)一個(gè)Rename事件和一個(gè)Modify事件
    修改一個(gè)文件的時(shí)候會(huì)觸發(fā)3-4個(gè)Modify事件
    我的MASK是
    JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_RENAMED| JNotify.FILE_MODIFIED

    不知道博主是否有遇到過(guò)這種問(wèn)題,謝謝

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2011-01-13 11:18 by nihao
    順便也把我的源代碼貼出來(lái)吧:

    package notify;

    import net.contentobjects.jnotify.*;

    class Listener implements JNotifyListener{
    public void fileRenamed(int wd, String rootPath, String oldName, String newName){
    System.out.println("renamed " + rootPath + " : " + oldName + " -> " + newName);
    }
    public void fileModified(int wd, String rootPath, String name){
    System.out.println("modified " + rootPath + " : " + name);
    }
    public void fileDeleted(int wd, String rootPath, String name){
    System.out.println("deleted " + rootPath + " : " + name);
    }
    public void fileCreated(int wd, String rootPath, String name){
    System.out.println("created " + rootPath + " : " + name);
    }
    public void print(String msg){
    System.err.println(msg);
    }
    }

    public class Main {

    public static void main(String[] args) throws JNotifyException {
    // TODO code application logic here
    String path = "D:/test";
    int mask = JNotify.FILE_CREATED | JNotify.FILE_DELETED | JNotify.FILE_RENAMED
    | JNotify.FILE_MODIFIED
    ;
    boolean watchSubtree = true;
    int watchID = JNotify.addWatch(path, mask, watchSubtree, new Listener());
    try {
    Thread.sleep(1000000);
    } catch (InterruptedException e1) {
    }
    JNotify.removeWatch(watchID);
    }
    }

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2011-01-13 23:19 by pengo
    創(chuàng)建的時(shí)候不會(huì),重命名和修改好像是一樣。

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2012-09-11 16:15 by wzp
    @semmy
    (只試過(guò)linux下的,windows下也差不多應(yīng)該)
    可以添加打開(kāi)文件的監(jiān)聽(tīng)
    在源碼中的JNotifyListener接口中添加open(),然后在JNotifyAdapterLinux(windows的改JNotifyAdapterWin32)類中,添加實(shí)現(xiàn)
    由于源碼中已經(jīng)存在 IN_OPEN = 0x00000020; /* File was opened */的定義,所以可以直接調(diào)用它,這個(gè)就是linux的打開(kāi)事件。
    代碼如下:
    在public int addWatch(String path, int mask, boolean watchSubtree, JNotifyListener listener)中添加:
    //訪問(wèn)文件
    if ((mask & JNotify.FILE_OPENED) != 0)
    {
    linuxMask |= JNotify_linux.IN_OPEN;
    }

    在protected void notifyChangeEvent(String name, int linuxWd, int linuxMask, int cookie)中添加 (具體位置自己讀代碼,應(yīng)該很容易分析出來(lái)的)
    //文件訪問(wèn)
    else
    if ((linuxMask & JNotify_linux.IN_OPEN) != 0)
    {
    watchData.notifyFileOpened(name);
    }
    最后在下面添加方法
    public void notifyFileOpened(String name)
    {
    String outRoot = getOutRoot();
    String outName = getOutName(name);
    _listener.fileOpenfied(getParentWatchID(), outRoot, outName);
    }
    這個(gè)只是linux中的測(cè)試代碼,仍然存在很多問(wèn)題。

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2015-06-29 10:02 by xugy
    @nihao
    你應(yīng)該是循環(huán)中進(jìn)行了多次 JNotify.addWatch 吧?
    在循環(huán)結(jié)束前 JNotify.removeWatch(watchID); 應(yīng)該就好了!

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2016-04-26 19:47 by summer_seo
    怎么在最后追加時(shí)間呢

    # re: java實(shí)現(xiàn)文件監(jiān)控  回復(fù)  更多評(píng)論   

    2016-04-26 19:48 by summer_seo
    怎么在追加信息里加入時(shí)間
    主站蜘蛛池模板: 免费精品视频在线| 亚洲国产成人久久综合野外| 国内永久免费crm系统z在线| 亚洲Av永久无码精品一区二区| 亚洲经典在线中文字幕| 亚洲性猛交XXXX| jizzjizz亚洲| 四虎在线免费播放| 97人妻无码一区二区精品免费| 成人性生交大片免费看好| 成人免费网站久久久| 丰满亚洲大尺度无码无码专线 | 亚洲免费视频网址| 亚洲精品乱码久久久久久自慰| 亚洲 综合 国产 欧洲 丝袜| 全免费a级毛片免费**视频| 天天影视色香欲综合免费| 久久久久久AV无码免费网站| 日本免费高清视频| 免费观看久久精彩视频| 三上悠亚电影全集免费| 一个人看的www在线免费视频| 黄页网站在线免费观看| 国产精品亚洲五月天高清| 国产亚洲女在线线精品| 亚洲av色香蕉一区二区三区| 亚洲国产av玩弄放荡人妇| 亚洲人成影院午夜网站| 亚洲国产成人精品青青草原| 亚洲国产精品成人综合色在线婷婷| 亚洲色欲或者高潮影院| 91亚洲va在线天线va天堂va国产| 亚洲另类激情综合偷自拍| 亚洲欧洲日韩国产综合在线二区| 亚洲精品自产拍在线观看动漫| 亚洲五月激情综合图片区| 亚洲嫩模在线观看| 亚洲男人电影天堂| 亚洲免费观看网站| 亚洲AV无码一区二区一二区| 免费的黄色网页在线免费观看|