IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#]utilisation de GZipStream et de DeflateStream


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 12
    Par défaut [C#]utilisation de GZipStream et de DeflateStream
    Bonjour à tous

    Je suis sur un projet où je doit pouvoir enregistrer plusieurs fichiers à des dates différentes dans une archive (et accessoirement les charger, les écraser ou tout simplement les ajouter à l'archive). L'ennui c'est que je ne peut pas me permettre d'utiliser la librairie SharpZipLib (dsl pr l'orthographe) car c'est un logiciel qui va être commercialisé.

    Je suis alors en train de rechercher des informations sur les classes GZipStream et DeflateStream. Ce qui me pose problème, c'est que je ne trouve que des informations sur l'archivage d'un seul et unique fichier (surtout avec GZipStream). Est-il au moins possible d'archiver plusieurs fichier ou même un dossier avec ses classes?

    Sinon, si quelqu'un a une autre idée qui puisse m'aider, je suis ouvert à toutes suggestion.

    Merci d'avance
    @++
    Chuck67

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Oui c'est possible, mais il faut le faire toi même.
    Tu crées ton format de fichier, et à chaque fois que tu as besoin de compresser/décompresser tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GZipStream cprss = new GZipStream(StreamCourant,CompressionMode,false);
    cprss.Read ou cprss.Write
    cprss.Close();
    Voilà, en ayant spécifié false, StreamCourant ne sera pas fermé à l'appel de Close

  3. #3
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Un exemple complet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;
    		}
    	}

Discussions similaires

  1. GZipStream & DeflateStream déconnent..
    Par Amokrane dans le forum C#
    Réponses: 0
    Dernier message: 27/12/2008, 00h20
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo