You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.4 KiB
46 lines
1.4 KiB
from __future__ import print_function |
|
import sys |
|
import struct |
|
import os |
|
|
|
#dummy class for stuffing the file headers into |
|
class FileEntry: |
|
pass |
|
|
|
#arguments are source directory, then target filename e.g. "pak1.pak" |
|
rootdir = sys.argv[1] |
|
pakfilename = sys.argv[2] |
|
|
|
pakfile = open(pakfilename,"wb") |
|
|
|
#write a dummy header to start with |
|
pakfile.write(struct.Struct("<4s2l").pack(b"PACK",0,0)) |
|
|
|
#walk the directory recursively, add the files and record the file entries |
|
offset = 12 |
|
fileentries = [] |
|
for root, subFolders, files in os.walk(rootdir): |
|
for file in files: |
|
entry = FileEntry() |
|
impfilename = os.path.join(root,file) |
|
entry.filename = os.path.relpath(impfilename,rootdir).replace("\\","/") |
|
if(entry.filename.startswith(".")):continue |
|
print("pak: "+entry.filename) |
|
with open(impfilename, "rb") as importfile: |
|
pakfile.write(importfile.read()) |
|
entry.offset = offset |
|
entry.length = importfile.tell() |
|
offset = offset + entry.length |
|
fileentries.append(entry) |
|
tablesize = 0 |
|
|
|
#after all the file data, write the list of entries |
|
for entry in fileentries: |
|
pakfile.write(struct.Struct("<56s").pack(entry.filename.encode("ascii"))) |
|
pakfile.write(struct.Struct("<l").pack(entry.offset)) |
|
pakfile.write(struct.Struct("<l").pack(entry.length)) |
|
tablesize = tablesize + 64 |
|
|
|
#return to the header and write the values correctly |
|
pakfile.seek(0) |
|
pakfile.write(struct.Struct("<4s2l").pack(b"PACK",offset,tablesize))
|
|
|