[C#] Compression Gzip, fonctionne plus

Résolu/Fermé
kelsett Messages postés 353 Date d'inscription dimanche 9 juillet 2006 Statut Membre Dernière intervention 13 octobre 2014 - 5 mai 2010 à 17:24
 ARIJ.AH - 25 juin 2013 à 16:09
Bonjour à tous,
Bon jvais essayer d'être clair et rapide:
Il y a quelques temps j'ai mis en place une application C# pour compresser des fichiers grâce à Gzip. Ca marchait super bien. Mais maintenant que je réessaie, dès que je compresse un fichier, lorsque je tente ensuite de l'ouvrir j'obtiens une fenêtre CLI (command line) pendant une demi seconde avant qu'elle ne se ferme, et l'application ne se lance pas.
Je ne comprends pas, je n'ai rien changé pourtant. J'ai pensé qu'il y avait peut être un souci avec le Framework .NET, mais je suis sur Win7 et le Framework 3.5 est installé par défaut, je ne peux pas le réinstaller donc, et le Framework 4.0 ne change rien à mon problème.
Pourriez vous m'aider? Merci



--
A voir également:

9 réponses

scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
5 mai 2010 à 19:13
Poste une archive contenant ton projet/ta solution si tu veux qu'on essaye de trouver le problème éventuel que tu as ;)

Car là comme ça non moi je n'ai pas d'idées sans avoir rien vu.
0
kelsett Messages postés 353 Date d'inscription dimanche 9 juillet 2006 Statut Membre Dernière intervention 13 octobre 2014 62
5 mai 2010 à 19:20
Bon en fait après recherches j'en suis arrivé à la conclusion que c'est mon code de compression qui marche pas.
J'explique:
J'ai d'abord eu l'idée de voir si j'arrivais à ouvrir avec un décompresseur tel que WinZip ou 7Zip. J'ai lancé le fichier, et ca a fonctionné parfaitement, ce qui montre donc que ce n'est pas un problème de corruption.
Seulement voilà après j'ai voulu voir si c'était pas dans le code qu'il y avait un soucis, j'ai rien changé et en recompilant mon compresseur, je tente de compresser un fichier, qui quand j'essaie de l'ouvrir ne montre plus une invite de commande pendant une demi seconde, mais un message d'erreur:
"C:\........ fichier.exe"
Le paramètre est incorrect.

Le résultat est le même, mais j'en conclus donc que c'est le code de compression qui foire là. Voici mon code:
byte[] OBuffer = new byte[OFileStream.Length];
                    // Read whole FileStream
                    OFileStream.Read(OBuffer, 0, System.Convert.ToInt32(OFileStream.Length));
                    // Close FileStream
                    OFileStream.Close();
                    // Create the file new file
                    OFileStream = new FileStream(fileTextbox.Text, FileMode.Create);

                    // Compress data
                    GZipStream OGZipStream = new GZipStream(OFileStream, CompressionMode.Compress, false);
                    // Write the compressed data in the file
                    OGZipStream.Write(OBuffer, 0, OBuffer.Length);
                    // Close GZipStream
                    OGZipStream.Close();
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
5 mai 2010 à 20:03
Pourquoi utiliser ne pas utiliser de FileStream qui sont bien plus simple qu'un tableau de byte pour lire ton fichier, voici un exemple qui tourne niquel chez moi :

using System;
using System.IO;
using System.IO.Compression;

namespace zip
{

    public class Program
    {

        public static void Main()
        {
            // Path to directory of files to compress and decompress.
            string dirpath = @"c:\users\public\reports";

            DirectoryInfo di = new DirectoryInfo(dirpath);

            // Compress the directory's files.
            foreach (FileInfo fi in di.GetFiles())
            {
                Compress(fi);

            }

            // Decompress all *.gz files in the directory.
            foreach (FileInfo fi in di.GetFiles("*.gz"))
            {
                Decompress(fi);

            }


        }

        public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and 
                // already compressed files.
                if ((File.GetAttributes(fi.FullName) 
                	& FileAttributes.Hidden)
                	!= FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file.
                    using (FileStream outFile = 
                    			File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress = 
                        	new GZipStream(outFile, 
                        	CompressionMode.Compress))
                        {
                            // Copy the source file into 
                            // the compression stream.
                        inFile.CopyTo(Compress);

                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

        public static void Decompress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Get original file extension, for example
                // "doc" from report.doc.gz.
                string curFile = fi.FullName;
                string origName = curFile.Remove(curFile.Length - 
                		fi.Extension.Length);

                //Create the decompressed file.
                using (FileStream outFile = File.Create(origName))
                {
                    using (GZipStream Decompress = new GZipStream(inFile,
                            CompressionMode.Decompress))
                    {
                        // Copy the decompression stream 
                        // into the output file.
            		    Decompress.CopyTo(outFile);
            		    
                        Console.WriteLine("Decompressed: {0}", fi.Name);

                    }
                }
            }
        }

    }
}


Essaye de comparer avec ton code pour voir ce qui ne fonctionne pas dans le tiens car là je n'ai pas tester le tiens ni même comparer avec le snippet que j'ai chopé sur un autre site (manque de temps déso).
0
kelsett Messages postés 353 Date d'inscription dimanche 9 juillet 2006 Statut Membre Dernière intervention 13 octobre 2014 62
5 mai 2010 à 20:42
J'ai déjà essayé, je trouvais aucune erreur dans mon code donc la meilleure idée que j'ai eu c'est de tester des bouts de code que je trouve sur internet, j'ai du tester 3-4 fonctions différentes (dont celle là) et j'obtiens toujours la même erreur :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
5 mai 2010 à 21:51
Je vais tester chez moi le bout de code que je t'ai donné, en targetant les différents frameworks (2.0, 3.0, 3.5, 4.0) et te tiendrais au courant.
0
kelsett Messages postés 353 Date d'inscription dimanche 9 juillet 2006 Statut Membre Dernière intervention 13 octobre 2014 62
5 mai 2010 à 21:56
Ok merci beaucoup :)
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
6 mai 2010 à 01:46
Chez moi ça fonctionne niquel avec le Framework 4.0.

Par contre pour les précédents (3.5, 3.0 et 2.0), il semble qu'il n'y ait pas de méthode CopyTo pour les Stream donc il faut écrire soit même le flux dans le fichier mais ça fonctionne bien aussi.

Peux-être glisses-tu une erreur lors de l'écriture de ton flux ou dans les paramètres de la méthode Write du GZipStream ?
0
kelsett Messages postés 353 Date d'inscription dimanche 9 juillet 2006 Statut Membre Dernière intervention 13 octobre 2014 62
6 mai 2010 à 22:11
Ouais... J'ai réinstallé le Framework 4.0, j'ai de nouveau la fenêtre noire :/
Bon visiblement c'est un problème de mon coté uniquement donc, ce qui est déjà une très bonne nouvelles puisque ca fonctionnera chez les utilisateurs de mon appli.

Qu'est ce que tu entends par "glisser une erreur" ? Si le fichier était corrompu, il ne pourrait pas être ouvert avec 7zip...
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
8 mai 2010 à 11:40
En effet j'avais confondu avec autre chose, il faut que je lise mieux tes messages ^^
0
vous pouvez utiliser :
using System.IO.Compression; du framework 4.0 ou 4.5

code :
string startPath = @"C:\test";
string zipPath = @"c:\test1.zip";
string extractPath = @"c:\example\extract";

//compression
ZipFile.CreateFromDirectory(startPath, zipPath);

//extraction
ZipFile.ExtractToDirectory(zipPath, extractPath);
0