private void xBoxCompress(string uncompFilename, string compFilename)
{
if (uncompFilename.ToLower() == compFilename.ToLower()) //nothing to do
return;
if (File.Exists(compFilename))
File.Delete(compFilename);
try
{
if (this.CompressionType == CompressionType.ZLib)
{
using (FileStream outFileStream = new FileStream(compFilename, FileMode.Create))
{
using (ZlibOutputStream outZStream = new ZlibOutputStream(outFileStream, true, JZlib.Z_BEST_COMPRESSION))
{
using (FileStream inFileStream = new FileStream(uncompFilename, FileMode.Open, FileAccess.Read))
{
copyStream(inFileStream, outZStream);
}
}
}
}
else if (this.CompressionType == CompressionType.ZLibChunk)
{
List<uint> sizes = new List<uint>();
List<uint> offsets = new List<uint>();
byte[] header = new byte[ZlibFilePad];
int pad = 0;
long lastUncompressedChunk;
long endPos;
EndianType et = this.EndianType;
int part = 0;
using (FileStream inFileStream = new FileStream(uncompFilename, FileMode.Open, FileAccess.Read))
{
long pos;
do
{
using (FileStream outFileStream = new FileStream(compFilename, inFileStream.Position == 0 ? FileMode.Create : FileMode.Append))
{
part++;
pad = (int)(outFileStream.Position % ZlibBlockPad);
if (pad != 0 && outFileStream.Position != 0)
outFileStream.Write(header, 0, (int)ZlibBlockPad - pad);
pos = outFileStream.Position;
outFileStream.Write(Encoding.ASCII.GetBytes("CHNK"), 0, 4);
outFileStream.Write(header, 0, (int)_zLibHeaderLen - 4);
lastUncompressedChunk = (long)_zLibChunkSize;
if (inFileStream.Position + lastUncompressedChunk > inFileStream.Length)
lastUncompressedChunk = inFileStream.Length - inFileStream.Position;
using (ZlibOutputStream outZStream = new ZlibOutputStream(outFileStream, true, JZlib.Z_BEST_COMPRESSION))
{
copyStream(inFileStream, outZStream, (int)lastUncompressedChunk);
offsets.Add((uint)pos);
sizes.Add((uint)(outFileStream.Position - pos) - _zLibHeaderLen);
}
}
} while (inFileStream.Position < inFileStream.Length);
using (FileStream outFileStream = new FileStream(compFilename, inFileStream.Position == 0 ? FileMode.Create : FileMode.Append))
{
//find the end of the last file.
endPos = (int)(outFileStream.Position % ZlibBlockPad);
if (endPos != 0)
endPos = ZlibBlockPad - endPos;
endPos += outFileStream.Position;
//pad the compressed file
pad = (int)(outFileStream.Position % ZlibFilePad);
if (pad != 0 && outFileStream.Position != 0)
outFileStream.Write(header, 0, (int)ZlibFilePad - pad);
}
using (FileStream outFileStream = new FileStream(compFilename, FileMode.Open))
{
using (BinaryEndianWriter bw = new BinaryEndianWriter(outFileStream))
{
long uncompressedTotal = 0;
EndianType e = this.EndianType;
for (int i = 0; i < offsets.Count; i++)
{
outFileStream.Seek(offsets[i] + 4, SeekOrigin.Begin);
bw.Write((uint)_zLibHeaderLen, e); //headerlen
bw.Write((uint)sizes[i], e); //blocklen
bw.Write((uint)(i != offsets.Count - 1 ? offsets[i + 1] - offsets[i] : 0xffffffff), e); //chunklen ffs if last item
//next blocklen 00's if last block
if (i == offsets.Count - 1) //last item
bw.Write((uint)0x00000000, e);
else if (i + 1 == offsets.Count - 1) //secondlast item
bw.Write((uint)(endPos - offsets[i + 1]), e);
else
bw.Write((uint)offsets[i + 2] - offsets[i + 1], e);
bw.Write((uint)(i != offsets.Count - 1 ? _zLibChunkSize : lastUncompressedChunk), e); //uncompressed size
bw.Write((uint)uncompressedTotal, e);
uncompressedTotal += (i != offsets.Count - 1 ? _zLibChunkSize : lastUncompressedChunk);
}
}
}
}
}
}
catch (Exception ex)
{
throw new ApplicationException(string.Format("Compress Failed: {0}", ex));
}
//using (FileStream sf = File.OpenRead(uncompFilename))
//{
// using (FileStream df = File.Create(compFilename))
// {
// using (DeflateStream ds = new DeflateStream(df, CompressionMode.Compress))
// {
// byte[] b = new byte[10000];
// int c = 0;
// do
// {
// c = sf.Read(b, 0, b.Length);
// ds.Write(b, 0, c);
// }
// while (c == b.Length);
// }
// }
//}
}