import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class DirectoryMonitor {
private final Map<String, Long> lastChecked = new ConcurrentHashMap<>(); // Directory path -> last checked timestamp
private final Map<String, Long> rateLimit = new ConcurrentHashMap<>(); // Directory path -> rate limit info
private final long checkIntervalSeconds;
private final int maxChecksPerSecond;
private final ScheduledExecutorService scheduler;
public DirectoryMonitor(long checkIntervalSeconds, int maxChecksPerSecond) {
this.checkIntervalSeconds = checkIntervalSeconds;
this.maxChecksPerSecond = maxChecksPerSecond;
this.scheduler = Executors.newSingleThreadScheduledExecutor();
}
public void start() {
scheduler.scheduleAtFixedRate(this::checkDirectories, 0, checkIntervalSeconds, TimeUnit.SECONDS);
}
public void stop() {
scheduler.shutdown();
}
private void checkDirectories() {
File rootDir = new File("."); // Monitor current directory by default
checkDirectory(rootDir);
}
public void checkDirectory(File dir) {
try {
if (!dir.exists()) {
System.err.println("Directory does not exist: " + dir.getAbsolutePath());
return; // Don't repeatedly check non-existent directories
}
long now = System.currentTimeMillis();
String dirPath = dir.getAbsolutePath();
// Rate limiting
if (rateLimit.containsKey(dirPath)) {
long lastCheckTime = rateLimit.get(dirPath);
long timeSinceLastCheck = now - lastCheckTime;
if (timeSinceLastCheck < 1000 / maxChecksPerSecond) { // Allow checks at most 1/maxChecksPerSecond seconds apart
return; // Skip check if rate limit is exceeded
}
}
// Actual directory check
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
checkDirectory(file); // Recursive check
} else {
System.out.println("File changed: " + file.getAbsolutePath()); //Example change detection
}
}
} else {
System.out.println("Directory changed: " + dir.getAbsolutePath());//Example change detection
}
// Update last checked timestamp and rate limit
lastChecked.put(dirPath, now);
rateLimit.put(dirPath, now);
} catch (Exception e) {
System.err.println("Error checking directory " + dir.getAbsolutePath() + ": " + e.getMessage());
}
}
public static void main(String[] args) throws InterruptedException {
DirectoryMonitor monitor = new DirectoryMonitor(5, 10); //Check every 5 seconds, limit to 10 checks/second
monitor.start();
Thread.sleep(60000); // Run for 60 seconds
monitor.stop();
}
}
Add your comment