# File System Monitor

This utility monitors a specific directory (and its subdirectories) for file system events such as file creation, deletion, modification, or moving. This is useful for tracking changes in a Downloads folder, a project directory, or a web server root.

**Modules Used:**
*   `watchdog`: A Python API library and shell utilities to monitor file system events.
*   `time`: To keep the script running.
*   [[programming/python/modules/logging-module|logging]]: To log the events to a file or console.
*   [[programming/python/modules/argparse-module|argparse]]: To handle command-line arguments.

## Prerequisites

This script needs to run continuously in the background to monitor changes. You can run it in a terminal window that you keep open, or use a tool like `screen` or `tmux` on Linux/macOS to keep it running after you disconnect.

## Installation

```bash
pip install watchdog
```

## The Code

Save this as `fs_monitor.py`.

```python
import sys
import time
import logging
import argparse
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MonitorHandler(FileSystemEventHandler):
    """Logs all the events captured."""

    def on_moved(self, event):
        what = 'directory' if event.is_directory else 'file'
        logging.info(f"Moved {what}: from {event.src_path} to {event.dest_path}")

    def on_created(self, event):
        what = 'directory' if event.is_directory else 'file'
        logging.info(f"Created {what}: {event.src_path}")

    def on_deleted(self, event):
        what = 'directory' if event.is_directory else 'file'
        logging.info(f"Deleted {what}: {event.src_path}")

    def on_modified(self, event):
        what = 'directory' if event.is_directory else 'file'
        logging.info(f"Modified {what}: {event.src_path}")

def start_monitoring(path_to_watch):
    # Configure logging
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        handlers=[
            logging.FileHandler("file_changes.log"),
            logging.StreamHandler(sys.stdout)
        ]
    )

    event_handler = MonitorHandler()
    observer = Observer()
    observer.schedule(event_handler, path_to_watch, recursive=True)
    
    print(f"Monitoring started on: {path_to_watch}")
    print("Press Ctrl+C to stop.")
    
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    
    observer.join()

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="File System Monitor")
    parser.add_argument("path", help="Directory path to monitor")
    
    args = parser.parse_args()
    
    start_monitoring(args.path)
```

## Usage

```bash
# Monitor your Downloads folder (Windows example)
python fs_monitor.py "C:\Users\YourUser\Downloads"

# Monitor a project folder on Linux/macOS
python fs_monitor.py ~/projects/my-app
```

The script will log all file changes to the console and to a file named `file_changes.log` in the directory where the script is run.

[[programming/python/python]]