`
zjutsoft
  • 浏览: 460309 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

多线程自动监视并扫描指定文件夹中的文件变化

    博客分类:
  • java
阅读更多

  采用多线程自动监视并扫描指定文件夹中的文件变化(文件数的变化和修改日期的变化),,实现其功能的代码由四个java文件组成 :FileListener.java,FileMonitor.java,FileTableModel.java,ParseUtility.java.其具体代码如下:



FileListener.java
package DirectoryScanner;

/**
 *
 * @author Hale Chou
 */
public interface FileListener {
    
    void dirChanged(FileMonitor monitor);
    
}


FileMonitor.java
package DirectoryScanner;

import java.io.File;
import java.util.ArrayList;
import java.util.List; 

/**
 *
 * @author Hale Chou
 */
public class FileMonitor implements Runnable {
    List<FileListener> listenerList = new ArrayList<FileListener>();
    
    private File dir;
    private long interval;
    private long lastScanedTime;
    private int oldLength;
   
    public void addListener(FileListener listener) {
        listenerList.add(listener);
    }
   
    public void start(boolean isDamon) {
        Thread t = new Thread(this);
        t.setDaemon(isDamon);
        t.start();
    }

    public FileMonitor(String _dir, long intervalTime) {
        File f = new File(_dir);        
        if(!f.isDirectory())
            throw new RuntimeException();
        
        //筛选出不是标准文件的目录
        File[] fileList = f.listFiles();
        for( int i = 0; i < fileList.length; i++ ) {
            if(fileList[i].isDirectory()) {
                fileList[i].delete();
            }
        }
            
        this.dir = f;
        this.interval = intervalTime ;
        this.oldLength = dir.listFiles().length;
    }
   
    public File[] getMonitoredFile() {
        return this.dir.listFiles();
    }
   
    public void run() {
        while(true) {
            if(!dir.isDirectory())
                throw new RuntimeException();
            if(filesChanged()) {
                fireFilesChangedEvent(this);
            }
            try {
                Thread.sleep(interval);
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
   
    private void fireFilesChangedEvent(FileMonitor monitor) {
        for( int i = 0; i < listenerList.size(); i ++ ) {
            listenerList.get(i).dirChanged(monitor);
        }
    }
  
    protected boolean filesChanged() {
        File[] newFiles = dir.listFiles();
        if(newFiles.length != oldLength) {
            oldLength = newFiles.length;
            //System.out.println(newFiles.length);
            return true;
        }
        for( int i = 0; i < newFiles.length; i++ ) {
            if(newFiles[i].lastModified() >= lastScanedTime) {
                return true;
            }
        }
        return false ;
    }
}


FileTableModel.java
package DirectoryScanner;

import java.io.File;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Hale Chou
 */
public class FileTableModel extends AbstractTableModel implements FileListener {
    private File[] files = null ;
    
    public FileTableModel(File dir) {
        files = dir.listFiles();        
    }

    public FileTableModel(File[] ff) {
        this.files = ff;            
    }
    
    public int getRowCount() {
        return  files.length;
    }
  
    //  Get a column's name.
    @Override
    public String getColumnName(int col) {
        String s = "文件名,路径,大小,修改时间";
        return s.split(",")[col];
    }
    
    public int getColumnCount() {
        return 4;
    }
  
    public Object getValueAt(int rowIndex, int columnIndex) {
        File f = files[rowIndex];
        
        if(f.isDirectory()){
            f.delete();
        }else{
            switch(columnIndex){
            case 0 :
                return f.getName();
            case 1 :
            return f.getPath();
            case 2 :
            return ParseUtility.bytes2kb(f.length());
            case 3 :
                return ParseUtility.toYYYYMMDDHHMMSS(f.lastModified());
            }
        }
        
        return "";
    }
  
    public void dirChanged(FileMonitor monitor) {
        this.files = monitor.getMonitoredFile();
        fireTableDataChanged();
    }
         
}


ParseUtility.java
package DirectoryScanner;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Administrator
 */
public class ParseUtility {
    
    public ParseUtility(){
    }
    
    public static String toYYYYMMDDHHMMSS(long time) {
        SimpleDateFormat format = new SimpleDateFormat("M月d日H时m分s秒");
        return format.format(new Date(time));
    }
    
    public static String bytes2kb(long bytes) {
        BigDecimal filesize = new BigDecimal(bytes);
        BigDecimal megabyte = new BigDecimal(1024 * 1024);
        float returnValue = filesize.divide(megabyte, 2 , BigDecimal.ROUND_UP).floatValue();
        if (returnValue > 1)
            return(returnValue + " MB");
        BigDecimal kilobyte = new BigDecimal(1024);
        returnValue = filesize.divide(kilobyte, 2 , BigDecimal.ROUND_UP).floatValue();
        return (returnValue + " KB");
    }
  
}


最后是调用程序
package file;

import java.io.File;
import javax.swing.table.TableModel;
import javax.swing.JFileChooser;
import javax.swing.event.*;

import DirectoryScanner.*;

/**
 *
 * @author  Hale Chou
 */
public class FileMonitorTest extends javax.swing.JFrame {
    
    public TableModel tableModel;
    
    /** Creates new form FileMonitorTest */
    public FileMonitorTest() {                      
        initComponents();             
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jLabel1 = new javax.swing.JLabel();
        txt_FilesCount = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txt_ScannedDirectory = new javax.swing.JTextField();
        btn_StartScan = new javax.swing.JButton();
        btn_SelectDirectory = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(jTable1);

        jLabel1.setText("当前文件数:");

        txt_FilesCount.setEditable(false);

        jLabel2.setText("选择文件夹:");

        btn_StartScan.setText("开始监视");
        btn_StartScan.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_StartScanActionPerformed(evt);
            }
        });

        btn_SelectDirectory.setText("选择目录");
        btn_SelectDirectory.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_SelectDirectoryActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_ScannedDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btn_SelectDirectory)
                .addContainerGap(31, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_FilesCount, javax.swing.GroupLayout.PREFERRED_SIZE, 198, 
                   javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btn_StartScan)
                .addContainerGap(31, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 170, 
                   javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txt_ScannedDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, 
                           javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btn_SelectDirectory)))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txt_FilesCount, javax.swing.GroupLayout.PREFERRED_SIZE, 
                           javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btn_StartScan)))
                .addContainerGap(48, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void btn_SelectDirectoryActionPerformed(java.awt.event.ActionEvent evt) {                                                    
        JFileChooser fc = new JFileChooser();
        
        fc.setDialogTitle("Select Directory");

        //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        
        int returnVal = fc.showOpenDialog(FileMonitorTest.this);
        
        if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();              
                txt_ScannedDirectory.setText(file.getPath());
            }
        else {
            

            }
    }                                                   

    private void btn_StartScanActionPerformed(java.awt.event.ActionEvent evt) {                                              
        String directory = txt_ScannedDirectory.getText();        
        FileMonitor fileMonitor = new FileMonitor(directory, 100);
        tableModel = new FileTableModel(new File(directory));
        fileMonitor.addListener((FileListener)tableModel);
        fileMonitor.start(true);
        
        jTable1.setModel(tableModel);
        
        tableModel.addTableModelListener(new TableModelListener() {
                public void tableChanged(TableModelEvent e) {                    
                    if(tableModel.getRowCount()>0){
                        txt_FilesCount.setText(String.valueOf(tableModel.getRowCount()));
                    }
                    else{
                        txt_FilesCount.setText("shit,have nothing in it!");
                    }                    
                }
            });
    }                                             
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FileMonitorTest().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_SelectDirectory;
    private javax.swing.JButton btn_StartScan;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextField txt_FilesCount;
    private javax.swing.JTextField txt_ScannedDirectory;
    // End of variables declaration                   
    
} 

  • 大小: 63.3 KB
分享到:
评论

相关推荐

    VBA写的检测特定目录下文件夹以及文件的更新情况表

    在这个特定的项目中,“VBA写的检测特定目录下文件夹以及文件的更新情况表”是一个利用VBA编写的程序,用于监测指定文件夹及其子文件夹内的文件状态变化,如新增、修改或删除。 该程序的核心功能可能包括以下几个...

    易语言源代码_文件夹监视.zip

    当文件夹中的文件发生变化时,程序将触发相应的事件处理函数。 2. **文件系统API调用**:在易语言中,可以通过调用操作系统提供的API函数来获取文件或文件夹的变更信息。例如,Windows API中的`...

    实现文件夹的备份及文件同步

    首先,文件夹的备份是指将一个或多个文件夹中的所有文件及其结构复制到另一个位置,以备不时之需。备份的目的在于防止数据丢失,例如硬件故障、病毒攻击或意外删除。在VC++中,可以使用Windows API函数如`CopyFile`...

    LanHelper(中文名称“局域网助手”)是Windows平台上强大的局域网管理、扫描、监视工具。

    包括了名称(NetBIOS名或者DNS名)、IP地址、MAC地址、工作组名、用户名称、操作系统类型、服务器类型、备注、共享文件夹、隐藏共享、共享打印机、共享文件夹的属性(是否可写、只读或者密码保护等)、共享备注等,而且...

    《Visual C# .NET精彩编程实例集锦》配套光盘文件【全】

    实例23 如何监视文件和文件夹系统变化情况 实例24 如何加解密文件 实例25 如何切分组合文件 实例26 如何以流式方式读写文本文件 实例27 如何直接打印文件 实例28 如何操作帮助文件 实例29 如何操作word文件 ...

    C#源码大集合 02(共3卷)

    │ │ ├─实例15 如何获取指定文件的根信息 │ │ ├─实例16 如何获取当前程序所在的文件夹 │ │ ├─实例17 如何获取指定文件夹下的所有文件 │ │ ├─实例18 如何获取指定文件夹下的所有文件夹 │ │ ├─实例...

    Visual.C#.编程精彩百例

    实例66 文件夹中的文件列表 实例67 读写文本文件 实例68 读写二进制文件 实例69 显示系统日期与时间(1) 实例70 显示差值的日期与时间(2) 实例71 时钟发生器应用 实例72 在.NET程序设计中使用ATL 实例73 ...

    C#源码大集合 01(共3卷)

    chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...

    C#源码大集合 03(共3卷)

    chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例155 批量改变指定文件的属性   5.8 加密与解密   cc实例156 文件的加密与解密   cc实例157 文件夹加密   5.9 其他文件管理知识   cc实例158 文件分割器   cc实例159 帮助文件   cc实例...

    用户使用说明文档1

    - 用户可以指定文件夹进行监控,设置各种监控选项,如文件行为记录,并将设置保存在Config.ini配置文件中。 - 监控到的文件修改记录可以保存并导出,右键菜单提供了查看文件的操作选项。 5. **系统需求**: - ...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_1

    VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg中。 vc++写的音乐播放器 VC++制作3D效果的旋转文字特效 VC++注册码加密源程序(含注册机...

    Visual C# .NET精彩编程实例集锦

    实例23 如何监视文件和文件夹系统变化情况 实例24 如何加解密文件 实例25 如何切分组合文件 实例26 如何以流式方式读写文本文件 实例27 如何直接打印文件 实例28 如何操作帮助文件 实例29 如何操作Word文件 实例30 ...

    vc++ 应用源码包_2

    VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg中。 vc++写的音乐播放器 VC++制作3D效果的旋转文字特效 VC++注册码加密源程序(含注册机...

    SoftPerfect Network Scanner v7.2.0.zip

    SoftPerfect Network Scanner是一款专业好用的的多线程的IP,NetBIOS和SNMP的扫描仪。该软件是专门为系统管理员和对计算机安全感兴趣的普通用户而设计的。可以实现利用计算机的网络接口捕获流经本机网络上数据报文,...

    vc++ 应用源码包_6

    VC++搜索指定文件夹中的文件 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg中。 vc++写的音乐播放器 VC++制作3D效果的旋转文字特效 VC++注册码加密源程序(含注册机...

Global site tag (gtag.js) - Google Analytics