Here's some old'n'crusty code...
...and it seems to still work too. Always a bonus!
Rem Compress() example End Rem Strict Local SFile:String = RequestFile("Source File") Local DFile:String = RequestFile("Destination PAK", "pak", True) CompressFile(SFile, DFile) SFile = RequestFile("Source PAK", "pak") DFile = RequestFile("Destination File", "", True) DeCompressFile(SFile, DFile) End Function CompressFile(SourceFileName:String, DestFileName:String) Local SourceBank:TBank, DestBank:TBank Local SourceFileStream:TStream, DestFileStream:TStream Local SourceFileSize:Int, DestBankSize:Int If ExtractExt(DestFileName).ToLower() <> "pak" Then DestFileName :+ ".pak" SourceFileSize = FileSize(SourceFileName) SourceBank = CreateBank(SourceFileSize) SourceFileStream = OpenStream(SourceFileName, True, False) If SourceFileStream = Null Then RuntimeError "Couldn't open source file ~q" + SourceFileName + "~q" ReadBank(SourceBank, SourceFileStream, 0, SourceFileSize) CloseStream SourceFileStream DestBankSize = Ceil(SourceFileSize * 1.001) + 12 DestBank = CreateBank(DestBankSize) compress(DestBank.Buf(), DestBankSize, SourceBank.Buf(), SourceFileSize) 'DestBank.Resize(DestBankSize) DestFileStream = WriteStream(DestFileName) If DestFileStream = Null Then RuntimeError "Couldn't create destination file ~q" + DestFileName + "~q" WriteInt DestFileStream, SourceFileSize WriteBank(DestBank, DestFileStream, 0, DestBankSize) CloseStream DestFileStream End Function Function DeCompressFile(SourceFileName:String, DestFileName:String) Local SourceBank:TBank, DestBank:TBank Local SourceFileStream:TStream, DestFileStream:TStream Local SourceFileSize:Int, DestBankSize:Int If ExtractExt(SourceFileName).ToLower() <> "pak" Then RuntimeError "Source file is not a PAK file" SourceFileSize = FileSize(SourceFileName) - 4 SourceBank = CreateBank(SourceFileSize) SourceFileStream = OpenStream(SourceFileName, True, False) If SourceFileStream = Null Then RuntimeError "Couldn't open source file ~q" + SourceFileName + "~q" DestBankSize = ReadInt(SourceFileStream) ReadBank(SourceBank, SourceFileStream, 0, SourceFileSize) CloseStream SourceFileStream DestBank = CreateBank(DestBankSize) uncompress(DestBank.Buf(), DestBankSize, SourceBank.Buf(), SourceFileSize) DestFileStream = WriteStream(DestFileName) If DestFileStream = Null Then RuntimeError "Couldn't create destination file ~q" + DestFileName + "~q" WriteBank(DestBank, DestFileStream, 0, DestBankSize) CloseStream DestFileStream End Function
...and it seems to still work too. Always a bonus!