import com.jniwrapper.win32.io.FileSystemEvent;
import com.jniwrapper.win32.io.FileSystemEventListener;
.....
import javax.swing.*;
import java.awt.*;
....
public class FileSystemWatcherSample extends LazyPanel implements ActionListener, FileSystemEventListener, PropertyChangeListener
{
private static FileSystemWatcherSample fileSystemWatcherSample = null;
private static final Logger LOG = Logger.getInstance(FileSystemWatcherSample.class);
static final String[] ACTION_NAMES = new String[]{"added", "removed", "modified", "renamed"};
static final String MESSAGE_TEMPLATE = "File ''{0}'' was {1}";
static final String SHORT_DATE_FORMAT = "HH:mm:ss";
static final String LONG_DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
private JLabel lblAdvisoryText;
private JLabel lblSelectedFolderCaption;
private SelectFolderField _selectFolderField;
private JCheckBox chkWatchSubtree;
private JCheckBox chkChangeFileName;
private JCheckBox chkChangeDirName;
private JCheckBox chkChangeAttributes;
private JCheckBox chkChangeSize;
private JCheckBox chkChangeLastWrite;
private JList lstEvents;
private DefaultListModel _listModel;
private JLabel lblEvents;
private FileSystemWatcher _fileSystemWatcher;
private JButton btnStart;
private JButton btnStop;
public FileSystemWatcherSample(Window parent)
{
super(parent);
}
public void initialize() throws Exception
{
lblAdvisoryText = new HTMLText("This sample demonstrates FileSystemWatcher class features.");
lblSelectedFolderCaption = new JLabel("Watching Folder:");
chkWatchSubtree = new JCheckBox("Watch Subtree", true);
chkChangeFileName = new JCheckBox("Watch File Name Change", true);
chkChangeDirName = new JCheckBox("Watch Dir Name Change", true);
chkChangeAttributes = new JCheckBox("Watch Attributes Change", true);
chkChangeSize = new JCheckBox("Watch Size Change", true);
chkChangeLastWrite = new JCheckBox("Watch Last Write Change", true);
_selectFolderField = new SelectFolderField();
_selectFolderField.addPropertyChangeListener(Selec tFolderField.PROPERTY_FOLDER, this);
lblEvents = new JLabel("File System Events:");
_listModel = new DefaultListModel();
lstEvents = new JList(_listModel);
btnStart = new JButton("Start");
btnStart.setEnabled(false);
btnStart.addActionListener(this);
btnStop = new JButton("Stop");
btnStop.setEnabled(false);
btnStop.addActionListener(this);
setLayout(new GridBagLayout());
add(lblAdvisoryText, new GridBagConstraints(0, 0, 2, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10, 10, 10, 10), 0, 0));
add(lblSelectedFolderCaption, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 10, 10), 0, 0));
add(_selectFolderField, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 10, 10), 0, 0));
add(chkWatchSubtree, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 10, 0, 0), 0, 0));
add(chkChangeFileName, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 5, 0, 10), 0, 0));
add(chkChangeDirName, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 10, 0, 0), 0, 0));
add(chkChangeAttributes, new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 5, 0, 10), 0, 0));
add(chkChangeSize, new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 10, 0, 0), 0, 0));
add(chkChangeLastWrite, new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3, 5, 0, 10), 0, 0));
add(lblEvents, new GridBagConstraints(0, 5, 1, 1, 0.0, 0.0
, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(10, 10, 0, 10), 0, 0));
JScrollPane eventPane = new JScrollPane(lstEvents);
Dimension preferredSize = new Dimension(200, 100);
eventPane.setPreferredSize(preferredSize);
eventPane.setMinimumSize(preferredSize);
add(eventPane, new GridBagConstraints(0, 6, 2, 1, 1.0, 1.0
, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 10, 10, 10), 0, 0));
JPanel buttonsPanel = new JPanel();
buttonsPanel.add(btnStart);
buttonsPanel.add(btnStop);
add(buttonsPanel, new GridBagConstraints(1, 7, 1, 1, 0.0, 0.0
, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 10, 0, 10), 0, 0));
add(new JPanel(), new GridBagConstraints(0, 8, 2, 1, 1.0, 1.0
, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
super.initialize();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource().equals(btnStart))
{
startWatching();
}
else if (e.getSource().equals(btnStop))
{
stopWatching();
}
}
private void startWatching()
{
_listModel.clear();
_fileSystemWatcher = new FileSystemWatcher(_selectFolderField.getFolder(), chkWatchSubtree.isSelected());
_fileSystemWatcher.addFileSystemListener(this);
FileSystemWatcher.WatcherOptions options = _fileSystemWatcher.getOptions();
options.setNotifyChangeAttributes(chkChangeAttribu tes.isSelected());
options.setNotifyChangeDirName(chkChangeDirName.is Selected());
options.setNotifyChangeFileName(chkChangeFileName. isSelected());
options.setNotifyChangeSize(chkChangeSize.isSelect ed());
options.setNotifyLastModified(chkChangeLastWrite.i sSelected());
btnStart.setEnabled(false);
btnStop.setEnabled(true);
try
{
_fileSystemWatcher.start();
_listModel.addElement("Started at " + getDateTime(true));
lstEvents.setSelectedIndex(0);
}
catch (FileSystemException e1)
{
LOG.error("", e1);
JOptionPane.showMessageDialog(this, "Unable to start watcher.\n" + e1, "File System Watcher", JOptionPane.WARNING_MESSAGE);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
}
}
private void stopWatching()
{
_listModel.addElement("Stopped at " + getDateTime(true));
final int size = _listModel.getSize() - 1;
lstEvents.setSelectedIndex(size);
lstEvents.ensureIndexIsVisible(size);
btnStart.setEnabled(true);
btnStop.setEnabled(false);
try
{
_fileSystemWatcher.stop();
}
catch (FileSystemException e1)
{
LOG.error("", e1);
}
}
public void deactivate()
{
if (_fileSystemWatcher != null && _fileSystemWatcher.isWatching())
{
stopWatching();
}
}
public void handle(FileSystemEvent event)
{
String actionName = ACTION_NAMES[event.getAction() - 1];
String message = MessageFormat.format(MESSAGE_TEMPLATE, new Object[]{event.getFileInfo(), actionName});
if (event.getAction() == FileSystemEvent.FILE_RENAMED)
message += " from '" + event.getOldFileInfo() + "'";
message += " at " + getDateTime(false);
_listModel.addElement(message);
final int size = _listModel.getSize() - 1;
lstEvents.setSelectedIndex(size);
lstEvents.ensureIndexIsVisible(size);
}
String getDateTime(boolean longFormat)
{
SimpleDateFormat dateFormat = new SimpleDateFormat(longFormat ? LONG_DATE_FORMAT : SHORT_DATE_FORMAT);
return dateFormat.format(new Date());
}
public void propertyChange(PropertyChangeEvent evt)
{
btnStart.setEnabled(true);
}
public static void main(String[] args)
{
FileSystemWatcherSample ventana = new FileSystemWatcherSample(null);
ventana.initialize();
ventana.setVisible(true);
}
}