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 104 105 106 107 108 109 110 111 112 113 114 115
| static void Main(string[] args)
{
try
{
CompressFile(@"Test.txt", @"Test.gz");
Console.WriteLine("Fichier Test.txt compressé vers Test.gz");
DecompressFile(@"Test.gz", @"TestDecompress.txt");
Console.WriteLine("Fichier Test.gz décompressé vers TestDecompress.txt");
}
catch (Exception ex)
{
Console.WriteLine(string.Format("{0}: {1}", ex.GetType(), ex.Message));
}
Console.ReadLine();
}
public static void CompressFile(string NomFichierACompresser, string NomFichierCompresse)
{
GZipStream outCompressedStream = null;
FileStream inFileStream = null;
FileStream outFileStream = null;
byte[] inBuffer;
try
{
// Ouvrir et lire le fichier à compresser
inFileStream = new FileStream(NomFichierACompresser, FileMode.Open, FileAccess.Read, FileShare.Read);
inBuffer = new byte[inFileStream.Length];
inFileStream.Read(inBuffer, 0, inBuffer.Length);
// Ouverture et creation du fichier à compresser
outFileStream = new FileStream(NomFichierCompresse, FileMode.CreateNew, FileAccess.Write, FileShare.Read);
// Ouverture du flux de compression
outCompressedStream = new GZipStream(outFileStream, CompressionMode.Compress);
// Compression
outCompressedStream.Write(inBuffer, 0, inBuffer.Length);
}
finally
{
// Fermeture des fluxs
if (inFileStream != null)
inFileStream.Close();
if (outCompressedStream != null)
outCompressedStream.Close();
if (outFileStream != null)
outFileStream.Close();
}
}
public static void DecompressFile(string sArchiveFile, string sDecompressedFile)
{
GZipStream inDecompressedStream = null;
FileStream inFileStream = null;
FileStream outFileStream = null;
byte[] inBuffer;
int iInBufferDataLength;
FileInfo fiArchiveFile;
try
{
// Ouverture du fichier à decompresser
inFileStream = new FileStream(sArchiveFile, FileMode.Open, FileAccess.Read, FileShare.Read);
// Creation du flux de decompression
inDecompressedStream = new GZipStream(inFileStream, CompressionMode.Decompress);
//
fiArchiveFile = new FileInfo(sArchiveFile);
inBuffer = new byte[fiArchiveFile.Length * 20];
// La decompression se fait en lisant le flux GzipStream
// On utilise cette fonction maison car Stream.Length n'est
// pas disponible pour GzipStream. A la sortie de cette fonction, inBuffer
// contient les données non compressées
iInBufferDataLength = ReadAllBytesFromStream(inDecompressedStream, ref inBuffer);
// Creation du fichier decompressé
outFileStream = new FileStream(sDecompressedFile, FileMode.CreateNew, FileAccess.Write, FileShare.Read);
outFileStream.Write(inBuffer, 0, iInBufferDataLength);
}
finally
{
// Fermeture flux ouvers
if (inFileStream != null)
inFileStream.Close();
if (inDecompressedStream != null)
inDecompressedStream.Close();
if (outFileStream != null)
outFileStream.Close();
}
}
private static int ReadAllBytesFromStream(GZipStream stream, ref byte[] buffer)
{
int iOffset = 0;
int iTotalBytesRead = 0;
int iBytesRead = 0;
// Le buffer doit au moins avoir 4ko en taille
if (buffer.Length < 4096)
Array.Resize<byte>(ref buffer, 4096);
// La decompression se fait en lisant le flux GzipStream
// On utilise cette fonction maison car Stream.Length n'est
// pas disponible pour GzipStream
while (true)
{
iBytesRead = stream.Read(buffer, iOffset, 4096);
if (iBytesRead == 0)
break;
iOffset += iBytesRead;
iTotalBytesRead += iBytesRead;
if (buffer.Length < (iOffset + 4096))
Array.Resize<byte>(ref buffer, 2 * buffer.Length);
}
return iTotalBytesRead;
}
} |
Partager