File Integrity Checker

import hashlib
import os
import json

def calculate_file_hash(file_path):
    """Calculate the SHA-256 hash of a file."""
    if not os.path.isfile(file_path):
        raise FileNotFoundError(f"The file '{file_path}' does not exist.")

    sha256_hash = hashlib.sha256()
    with open(file_path, "rb") as f:
        # Read and update hash string value in blocks of 4K
        for byte_block in iter(lambda: f.read(4096), b""):
            sha256_hash.update(byte_block)
    return sha256_hash.hexdigest()

def save_hash(file_path, hash_value):
    """Save the hash value to a .json file."""
    if not os.path.exists("file_hashes.json"):
        with open("file_hashes.json", "w") as f:
            json.dump({}, f)

    with open("file_hashes.json", "r+") as f:
        try:
            data = json.load(f)
        except json.JSONDecodeError:
            data = {}

        data[file_path] = hash_value
        f.seek(0)
        json.dump(data, f, indent=4)

def check_file_integrity(file_path):
    """Check if a file's hash matches the stored hash."""
    current_hash = calculate_file_hash(file_path)
    
    if os.path.exists("file_hashes.json"):
        with open("file_hashes.json", "r") as f:
            data = json.load(f)
            stored_hash = data.get(file_path)

        if stored_hash:
            if current_hash == stored_hash:
                return "File is intact."
            else:
                return "File has been modified!"
        else:
            return "No stored hash found for this file."
    else:
        return "No hash records found. Please save the hash first."

if __name__ == "__main__":
    action = input("Enter 'save' to save a file hash or 'check' to check file integrity: ").strip().lower()
    file_path = input("Enter the path of the file: ")

    if action == 'save':
        file_hash = calculate_file_hash(file_path)
        save_hash(file_path, file_hash)
        print(f"Hash for '{file_path}' saved.")
    elif action == 'check':
        result = check_file_integrity(file_path)
        print(result)
    else:
        print("Invalid action. Please enter 'save' or 'check'.")