import time
import os
import logging
import argparse
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def monitor_directory(directories, interval, edge_cases=False):
"""
Monitors the state of specified directories for changes.
Args:
directories (list): A list of directory paths to monitor.
interval (int): The time interval (in seconds) between checks.
edge_cases (bool): If True, includes extra checks for empty directories
or non-existent directories.
"""
if edge_cases:
all_dirs_exist = True
for dir_path in directories:
if not os.path.exists(dir_path):
logging.warning(f"Directory {dir_path} does not exist.")
all_dirs_exist = False
if not all_dirs_exist:
logging.info("Exiting due to missing directories.")
return
while True:
for dir_path in directories:
try:
current_state = os.listdir(dir_path)
previous_state = None # Initialize for the first iteration
if previous_state is None:
logging.info(f"Initial state of {dir_path}: {current_state}")
else:
new_items = [item for item in current_state if item not in previous_state]
removed_items = [item for item in previous_state if item not in current_state]
if new_items:
logging.info(f"New items in {dir_path}: {new_items}")
if removed_items:
logging.info(f"Removed items from {dir_path}: {removed_items}")
# Handle empty directory edge case
if not current_state and edge_cases:
logging.warning(f"{dir_path} is empty.")
previous_state = current_state # Update for the next iteration
except OSError as e:
logging.error(f"Error accessing {dir_path}: {e}")
time.sleep(interval)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Monitor directories for changes.")
parser.add_argument("directories", nargs="+", help="List of directories to monitor.")
parser.add_argument("-i", "--interval", type=int, default=5, help="Interval between checks (seconds).")
parser.add_argument("-e", "--edge_cases", action="store_true", help="Include extra checks (empty/missing dirs).")
args = parser.parse_args()
monitor_directory(args.directories, args.interval, args.edge_cases)
Add your comment