1. import os
  2. import sys
  3. import json
  4. import argparse
  5. def validate_filename(filename):
  6. """Basic filename validation."""
  7. if not filename:
  8. return False, "Filename cannot be empty."
  9. if not filename.endswith(('.bin')):
  10. return False, "Filename must end with .bin"
  11. return True, None
  12. def extract_metadata(filepath):
  13. """Extracts metadata from a binary file (simulated)."""
  14. try:
  15. with open(filepath, 'rb') as f:
  16. # Simulate reading metadata - replace with actual parsing logic
  17. metadata = {
  18. "size": os.path.getsize(filepath),
  19. "creation_date": file_creation_date(filepath),
  20. "author": "Unknown",
  21. "description": "Binary file metadata"
  22. }
  23. return metadata
  24. except FileNotFoundError:
  25. return None
  26. except Exception as e:
  27. print(f"Error reading file {filepath}: {e}")
  28. return None
  29. def file_creation_date(filepath):
  30. """Simulates getting creation date."""
  31. return os.path.getctime(filepath)
  32. def attach_metadata(filepath, metadata_file):
  33. """Attaches metadata to a binary file."""
  34. is_valid, error_message = validate_filename(filepath)
  35. if not is_valid:
  36. print(f"Error: {error_message}")
  37. return False
  38. metadata = extract_metadata(filepath)
  39. if metadata is None:
  40. return False
  41. try:
  42. with open(metadata_file, 'r') as f:
  43. try:
  44. metadata_data = json.load(f)
  45. except json.JSONDecodeError:
  46. print(f"Error: Invalid JSON in {metadata_file}. Creating a new metadata file.")
  47. metadata_data = {}
  48. except FileNotFoundError:
  49. print(f"Creating new metadata file {metadata_file}")
  50. metadata_data = {}
  51. except Exception as e:
  52. print(f"Error reading metadata file {metadata_file}: {e}")
  53. return False
  54. metadata_data[os.path.basename(filepath)] = metadata
  55. try:
  56. with open(metadata_file, 'w') as f:
  57. json.dump(metadata_data, f, indent=4)
  58. print(f"Metadata attached to {filepath} and saved to {metadata_file}")
  59. return True
  60. except Exception as e:
  61. print(f"Error writing to metadata file {metadata_file}: {e}")
  62. return False
  63. def main():
  64. parser = argparse.ArgumentParser(description="Attach metadata to binary files.")
  65. parser.add_argument("binary_files", nargs="+", help="List of binary files to process.")
  66. parser.add_argument("-m", "--metadata_file", default="metadata.json", help="File to store metadata.")
  67. args = parser.parse_args()
  68. for binary_file in args.binary_files:
  69. attach_metadata(binary_file, args.metadata_file)
  70. if __name__ == "__main__":
  71. main()

Add your comment