Compress and Stat Zip File Creator

  • Share this:

Code introduction


This function compresses all files in the given directory into a zip file and adds a json file containing file statistics for each file.


Technology Stack : os, zipfile, json, datetime, shutil, sys, stat, io, base64, time, random, string, hashlib, re, urllib.request, socket, threading, queue, concurrent.futures, csv

Code Type : File archiving and metadata addition

Code Difficulty : Advanced


                
                    
def zip_file(file_path):
    import os
    import zipfile
    import json
    import datetime
    import shutil
    import sys
    import stat
    import io
    import base64
    import time
    import random
    import string
    import hashlib
    import re
    import urllib.request
    import socket
    import threading
    import queue
    import concurrent.futures
    import csv

    def create_zip(path, zip_path):
        with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            for root, dirs, files in os.walk(path):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, path))

    def get_file_size(file_path):
        return os.path.getsize(file_path)

    def get_file_md5(file_path):
        hash_md5 = hashlib.md5()
        with open(file_path, "rb") as f:
            for chunk in iter(lambda: f.read(4096), b""):
                hash_md5.update(chunk)
        return hash_md5.hexdigest()

    def get_file_modified_time(file_path):
        return datetime.datetime.fromtimestamp(os.path.getmtime(file_path))

    def get_file_permissions(file_path):
        return stat.S_IMODE(os.lstat(file_path).st_mode)

    def file_stats(file_path):
        return {
            "size": get_file_size(file_path),
            "md5": get_file_md5(file_path),
            "modified_time": get_file_modified_time(file_path).isoformat(),
            "permissions": oct(get_file_permissions(file_path))
        }

    def zip_file_with_stats(file_path, zip_path):
        stats = file_stats(file_path)
        with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
            zipf.write(file_path, os.path.basename(file_path))
            json_data = json.dumps(stats)
            zipf.writestr(os.path.basename(file_path) + ".json", json_data)

    def process_files_in_directory(directory_path):
        zip_path = os.path.join(directory_path, "archive.zip")
        create_zip(directory_path, zip_path)
        zip_file_with_stats(zip_path, zip_path + ".stats.zip")

    process_files_in_directory(file_path)