[C#] Compression Gzip, fonctionne plus
Résolu
kelsett
Messages postés
353
Date d'inscription
Statut
Membre
Dernière intervention
-
ARIJ.AH -
ARIJ.AH -
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
--
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:
- [C#] Compression Gzip, fonctionne plus
- Meilleur logiciel de compression gratuit - Guide
- Compression pdf - Guide
- Compression pdf gratuit - Télécharger - PDF
- Le fichier contient un type de compression non pris en charge - Forum Format et connectique vidéo
- Quel est le fichier avec le taux de compression le plus élevé ? ✓ - Forum Montage et acquisition vidéo
9 réponses
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.
Car là comme ça non moi je n'ai pas d'idées sans avoir rien vu.
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:
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:
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();
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 :
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).
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).
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 :/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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 ?
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 ?
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...
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...
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);
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);