file / directory listener

J

James

I'd like to write a file / directory listener that would listen for
modifications, creations, and name changes of files and directories.
What's the best way to go about this? Is there a project that have done
this already?
 
R

Roedy Green

J

Jacob

James said:
I'd like to write a file / directory listener that would listen for
modifications, creations, and name changes of files and directories.
What's the best way to go about this? Is there a project that have done
this already?

The simplest way to acheive this is by polling.
I have an implementation of this which you may
use (attached). The listener class must implement
the FileListener interface:

public interface FileListener
{
void fileChanged (File file);
}


The listener class must instantiate a FileMonitor
object, identify which files/directories to listen
for, and add itself as a listener:

// Poll once every second (1000ms)
FileMonitor fileMonitor = new FileMonitor (1000);

fileMonitor.addFile (new File ("/some/file"));
fileMonitor.addFile (new File ("/some/directory"));
fileMonitor.addFile (new File ("/one/more/file"));

fileMonitor.addListener (this);


Complete listing of the FileMonitor class:



import java.util.*;
import java.io.File;
import java.lang.ref.WeakReference;


/**
* Class for monitoring changes in disk files.
* Usage:
*
* 1. Implement the FileListener interface.
* 2. Create a FileMonitor instance.
* 3. Add the file(s)/directory(ies) to listen for.
*
* fileChanged() will be called when a monitored file is created,
* deleted or its modified time changes.
*/
public class FileMonitor
{
private Timer timer_;
private HashMap files_; // File -> Long
private Collection listeners_; // of WeakReference(FileListener)


public FileMonitor (long pollingInterval)
{
files_ = new HashMap();
listeners_ = new ArrayList();

timer_ = new Timer (true);
timer_.schedule (new FileMonitorNotifier(), 0, pollingInterval);
}


public void stop()
{
timer_.cancel();
}


public void addFile (File file)
{
if (!files_.containsKey (file)) {
long modifiedTime = file.exists() ? file.lastModified() : -1;
files_.put (file, new Long (modifiedTime));
}
}


public void removeFile (File file)
{
files_.remove (file);
}


public void addListener (FileListener fileListener)
{
// Don't add if its already there
for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
WeakReference reference = (WeakReference) i.next();
FileListener listener = (FileListener) reference.get();
if (listener == fileListener)
return;
}

// Use WeakReference to avoid memory leak if this becomes the
// sole reference to the object.
listeners_.add (new WeakReference (fileListener));
}


public void removeListener (FileListener fileListener)
{
for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
WeakReference reference = (WeakReference) i.next();
FileListener listener = (FileListener) reference.get();
if (listener == fileListener) {
i.remove();
break;
}
}
}


private class FileMonitorNotifier extends TimerTask
{
public void run()
{
// Loop over the registered files and see which have changed.
// Use a copy of the list in case listener wants to alter the
// list within its fileChanged method.
Collection files = new ArrayList (files_.keySet());

for (Iterator i = files.iterator(); i.hasNext(); ) {
File file = (File) i.next();
long lastModifiedTime = ((Long) files_.get (file)).longValue();
long newModifiedTime = file.exists() ? file.lastModified() : -1;

// Chek if file has changed
if (newModifiedTime != lastModifiedTime) {

// Register new modified time
files_.put (file, new Long (newModifiedTime));

// Notify listeners
for (Iterator j = listeners_.iterator(); j.hasNext(); ) {
WeakReference reference = (WeakReference) j.next();
FileListener listener = (FileListener) reference.get();

// Remove from list if the back-end object has been GC'd
if (listener == null)
j.remove();
else
listener.fileChanged (file);
}
}
}
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top