Probleme de Compression avec SharpZipLib

cs_Squale76 Messages postés 4 Date d'inscription samedi 30 juin 2007 Statut Membre Dernière intervention 18 décembre 2007 - 21 oct. 2007 à 11:51
cs_Squale76 Messages postés 4 Date d'inscription samedi 30 juin 2007 Statut Membre Dernière intervention 18 décembre 2007 - 25 oct. 2007 à 07:03
Bonjour à tous,

Je developpe depuis peu avec SharpDevelop 2.0 et je voudrais compresser un fichier unique avec la dll SharpZipLib v0.85.4.369.
Le
fichier .zip est bien créé avec le bon nom et au bon endroit, la taille
de ce fichier est bien plus petite que le fichier non compressé mais
lorsque j'ouvre ce fichier avec un dézippeur quelconque "UltimateZip"
ou autre, la taille du fichier est soit -1ko ou plus de 4000000ko et sa
decompression par ces dezippeurs est très longue.

Si vous avez des idées sur le problème, aidez moi.....

Voici le code utilisé (basé sur le code de Yohann MARTEL):





namespace

Compression
{
     
/// Classe de compression Zip avec ICSharpCode.SharpZipLib.dll


      public
class
Zip
      {
           
string
StrPathFichier; 
// on stocke le chemin + fichier


           
// Constructeur


           

public


Zip(
string
StrFiles)
            {
                  StrPathFichier= StrFiles;
            }
           

public bool



Compression

(



int


intLvlZip,
string
strExt)
            {
                 

bool

BolReussi = false;
// on initialise la méthode de cryptage à faux


                  try
                  {
                       
string
StrCheminZip = Path. GetDirectoryName (StrPathFichier) + "\" + (Path.GetFileNameWithoutExtension(StrPathFichier)) + strExt;
                        FileStream fZip =File.Create(StrCheminZip);

                        ZipOutputStream MyZipOutputStream = new ZipOutputStream(fZip);
                        MyZipOutputStream.SetLevel(5);
                       
                        FileStream fs = File.OpenRead(StrPathFichier);
                       

byte

[] tampon =


new



byte

[fs.Length];
                        fs.Read(tampon,0,tampon.Length);
                       
                        ZipEntry theEntry =


new




ZipEntry
(Path.GetFileName(StrPathFichier));
                        MyZipOutputStream.PutNextEntry(theEntry);
                        MyZipOutputStream.Write(tampon, 0, tampon.Length);
                       
                        MyZipOutputStream.Finish();
                        MyZipOutputStream.Close();
                        fZip.


Close


();

                        BolReussi = true;
// on met la variable sur réussi


                        return BolReussi;
                  }
                  catch
                  {
                       

return

BolReussi;
                  }
            }
      }
}

2 réponses

cs_Squale76 Messages postés 4 Date d'inscription samedi 30 juin 2007 Statut Membre Dernière intervention 18 décembre 2007
22 oct. 2007 à 11:05
Je pense avoir un probleme de CRC.

J'ai trouvé un bout de code pour le calcul du CRC avec Sharpziplib mais en VB :
http://www.vbfrance.com/codes/ZIPPER-AVEC-SHARPZIPLIB_25357.aspx

Comment intégrer ce calcul de CRC dans mon code?

Merci d'avance.
0
cs_Squale76 Messages postés 4 Date d'inscription samedi 30 juin 2007 Statut Membre Dernière intervention 18 décembre 2007
25 oct. 2007 à 07:03
En essayant plusieurs choses, j'ai testé ce code et ça marche :



public

static
void

Zip

(
string
SrcFile
,
string
DstFile
,

int

BufferSize
)



// SrcFile : Chemin et nom du fichier source
// DstFile : Chemin et nom du fichier Destination (Zip)
// BufferSize : Taille du buffer de compression
{<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>






     


try








     


{






     

Crc32 objCrc32
=

new


Crc32

();






     

ZipOutputStream zos
;






     








     

zos 
=

 new ZipOutputStream

(
File
.

Create

(
DstFile
));
// your zipfile






 







     

FileStream strmFile
=
File
.

OpenRead

(
SrcFile
);






     


byte

[]
abyBuffer
=

new


byte

[
Convert
.

ToInt32

(
strmFile
.
Length
)];






     

strmFile
.

Read

(
abyBuffer
,
 0
,
 abyBuffer
.
Length
);






     

ZipEntry objZipEntry 
=

 new ZipEntry

(
Path
.

GetFileName

(
SrcFile
));






 







     

objZipEntry
.
DateTime 
=
 DateTime
.
Now
;






     

objZipEntry
.
Size 
=
 strmFile
.
Length
;






     

strmFile
.

Close

();






     

objCrc32
.

Reset

();






     

objCrc32
.

Update

(
abyBuffer
);






     

objZipEntry
.
Crc 
=
 objCrc32
.
Value
;






     

zos
.

PutNextEntry

(
objZipEntry
);






     

zos
.

Write

(
abyBuffer
,
 0
,
 abyBuffer
.
Length
);






 







     

zos
.

Finish

();






     

zos
.

Close

();






     

    






     

}






     


catch 

(
Exception ex
)






      {






           

MessageBox
.

Show

(
ex
.

ToString

());






      }





}



Reste un probleme, j'ai testé sur différents fichiers et une taille de 11Mo tout est OK mais pour un fichier de 79 Mo, j'ai un plantage de l'application.
Comment peut on faire pour que le "
File
.

OpenRead

(
SrcFile
)" se fasse en plusieurs fois ?
0
Rejoignez-nous