1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
private void CompressionLZ4_Archivage(List<string> fichiers, string fichierArchive)
{
// codage: entête t1[]+fichiers non compressé t2[]
// t1:
// 1- nombre de fichiers [0] [1] [2] [3]
// 2- taille du fichier [0] [1] [2] [3]
// 3- taille du nom du fichier [0] [1] [2] [3]
// 4- nom du fichier
// ... répétition
// t2:
// t2+uncompressed[]
// fin: compression du codage
// En-tête
int nbFichiers = fichiers.Count;
byte[] t1 = BitConverter.GetBytes(nbFichiers); // [0] [1] [2] [3]
// 1er fichier
byte[] t2 = System.IO.File.ReadAllBytes(fichiers[0].ToString());
// En-Tête
int tailleFichier = t2.Length;
byte[] t3 = BitConverter.GetBytes(tailleFichier); // [0] [1] [2] [3]
t1 = CollerBytes(t1, t3);
string nomFichier = System.IO.Path.GetFileName(fichiers[0].ToString());
t3 = Encoding.ASCII.GetBytes(nomFichier);
byte[] t4 = BitConverter.GetBytes(t3.Length); // [0] [1] [2] [3]
t1 = CollerBytes(t1, t4);
t1 = CollerBytes(t1, t3);
for (int i = 1; i < nbFichiers; i++)
{
// Empile la compression
nomFichier = System.IO.Path.GetFileName(fichiers[i].ToString());
byte[] uncompressed = System.IO.File.ReadAllBytes(fichiers[i].ToString());
t2 = CollerBytes(t2, uncompressed);
// Modifie l'en-tête
tailleFichier = uncompressed.Length;
t3 = BitConverter.GetBytes(tailleFichier); // [0] [1] [2] [3]
t1 = CollerBytes(t1, t3);
t3 = Encoding.ASCII.GetBytes(nomFichier);
t4 = BitConverter.GetBytes(t3.Length); // [0] [1] [2] [3]
t1 = CollerBytes(t1, t4);
t1 = CollerBytes(t1, t3);
}
byte[] final = CollerBytes(t1, t2);
byte[] compressed = LZ4Sharp.LZ4.Compress(final);
System.IO.File.WriteAllBytes(fichierArchive, compressed);
}
private void DecompressionLZ4_Archivage(string fichierArchive, string repertoireSortie)
{
// codage: entête t1[]+fichiers non compressé t2[]
// t1:
// 1- nombre de fichiers [0] [1] [2] [3]
// 2- taille du fichier [0] [1] [2] [3]
// 3- taille du nom du fichier [0] [1] [2] [3]
// 4- nom du fichier
// ... répétition
// t2:
// t2+uncompressed[]
// fin: compression du codage
byte[] compressed = System.IO.File.ReadAllBytes(fichierArchive);
byte[] uncompressed = LZ4Sharp.LZ4.Decompress(compressed);
// Entête
int index = 0;
byte[] t1 = new byte[4];
System.Buffer.BlockCopy(uncompressed, index, t1, 0, 4);
index += 4;
int nbFichiers = BitConverter.ToInt32(t1, 0);
List<int> tailleFichier = new List<int>();
List<string> nomFichier = new List<string>();
for (int i = 0; i < nbFichiers; i++)
{
// Taille fichier
System.Buffer.BlockCopy(uncompressed, index, t1, 0, 4);
tailleFichier.Add(BitConverter.ToInt32(t1, 0));
index += 4;
// Taille du nom du fichier
System.Buffer.BlockCopy(uncompressed, index, t1, 0, 4);
int tailleNomFichier = BitConverter.ToInt32(t1, 0);
index += 4;
// Nom du fichier
byte[] t = new byte[tailleNomFichier];
System.Buffer.BlockCopy(uncompressed, index, t, 0, tailleNomFichier);
nomFichier.Add(Encoding.ASCII.GetString(t));
index += tailleNomFichier;
}
// Fichiers
for (int i = 0; i < nbFichiers; i++)
{
byte[] t = new byte[tailleFichier[i]];
System.Buffer.BlockCopy(uncompressed, index, t, 0, tailleFichier[i]);
index += tailleFichier[i];
string fichier = repertoireSortie + "\\" + nomFichier[i];
System.IO.File.WriteAllBytes(fichier, t);
}
}
private byte[] CollerBytes(byte[] t1, byte[] t2)
{
byte[] t3 = new byte[t1.Length + t2.Length];
System.Buffer.BlockCopy(t1, 0, t3, 0, t1.Length);
System.Buffer.BlockCopy(t2, 0, t3, t1.Length, t2.Length);
return t3;
} |