#!/usr/bin/env python # Cross+Channel .PD archive repacking tool # # Takes a directory of files and creates an archive from them. # # Last modified 2006-06-12, Edward Keyes, ed-at-insani-dot-org import sys, os from insani import * if len(sys.argv) != 3 : print 'Please give an input directory name and Cross+Channel archive'+ \ ' filename\non the command line.' sys.exit(0) dirname = sys.argv[1] if not os.path.isdir(dirname) : print 'Error opening directory %s, aborting' % dirname sys.exit(0) rawnames = os.listdir(dirname) numfiles = 0 position = 144*16384+72 entries = [] for filename in rawnames : fullpath = os.path.join(dirname,filename) if os.path.isfile(fullpath) : # Skip any subdirectories numfiles += 1 size = os.stat(fullpath).st_size entries.append( (filename, fullpath, position, size) ) position += size; print 'Packing %d files...' % numfiles arcfile = open(sys.argv[2],'wb') arcfile.write('PackOnly') write_zeroes(arcfile,56) write_unsigned(arcfile,numfiles,LONG_LENGTH) print 'Writing archive index...' for (filename, fullpath, position, size) in entries : write_string(arcfile,filename) write_zeroes(arcfile,128-len(filename)-1) write_unsigned(arcfile,position,LONG_LENGTH) write_unsigned(arcfile,size,LONG_LENGTH) write_zeroes(arcfile,144*(16384-numfiles)) for (filename, fullpath, position, size) in entries : print 'Packing %s (%d bytes) at offset 0x%X' % \ (filename, size, position) assert (arcfile.tell() == position) infile = open(fullpath,'rb') arcfile.write(infile.read(size)) infile.close() arcfile.close()