You can download this code by clicking the button below.
This code is now available for download.
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)