Code:
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
string[] files = Directory.GetFiles(dir_label.Text);
Invoke(new MethodInvoker(delegate
{
progressBar1.Value = 0;
progressBar1.Maximum = files.Length;
}));
CompressionMode mode;
if (radio_inflate.Checked) { mode = CompressionMode.Decompress; }
else { mode = CompressionMode.Compress; }
foreach (string file in files)
{
string filename = "";
if (radio_inflate.Checked) { StringCipher.Decode(Path.GetFileName(file), ref filename); }
else if (radio_deflate.Checked) { StringCipher.Encode(Path.GetFileName(file), ref filename); }
byte[] data;
int data_size;
try
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
using (BinaryReader br = new BinaryReader(fs))
{
if (radio_inflate.Checked)
{
br.ReadBytes(5);
br.ReadInt32();
int size = br.ReadInt32();
data = br.ReadBytes(size);
}
else
{
data = br.ReadBytes((int)fs.Length);
XOREn XOR = new XOREn();
byte xor_index = 0;
if (XOR.Encrypted(Path.GetExtension(file))) { XOR.Xor(ref data, ref xor_index); }
}
}
}
}
catch (Exception ex) { data = new byte[0]; }
data_size = data.Length;
try
{
using (MemoryStream mem = new MemoryStream())
{
using (ZlibStream stream = new ZlibStream(mem, mode))
{
stream.Write(data, 0, data.Length);
}
data = mem.ToArray();
}
}
catch { MessageBox.Show(filename); }
using(FileStream fs = File.Create(Path.GetDirectoryName(file) + "\\" + filename))
{
using(BinaryWriter bw = new BinaryWriter(fs))
{
if (radio_inflate.Checked)
{
XOREn XOR = new XOREn();
byte xor_index = 0;
if (XOR.Encrypted(Path.GetExtension(filename))) { XOR.Xor(ref data, ref xor_index); }
bw.Write(data);
}
else
{
bw.Write(new byte[5] { 0x00, 0x51, 0x3F, 0x99, 0x1A });
bw.Write((int)data_size);
bw.Write((int)data.Length);
bw.Write(data);
}
}
}
File.Delete(file);
Invoke(new MethodInvoker(delegate { progressBar1.Value++; }));
}
}
Piece of code from an app i wrote a while back to pack and unpack patch files.