Compression / decompression a partir du sdk lzma de 7zip ( multi fichier )

Soyez le premier à donner votre avis sur cette source.

Vue 15 163 fois - Téléchargée 826 fois

Description

Comme le dit le titre, cette librairie / class, je ne sais pas comment vous appelez ça ( ça ne fait pas longtemps que je fais du C# faut dire ... )
permet tout simplement de compresser/décompresser plusieurs fichier en utilisant l'algorithme LZMA.
Fichier, dossier, date de création, date de modification sont conservé, ainsi que le CRC32 qui est vérifié lors de la décompression.

Bon, il est vrai que ça fait doublon a 7Zip, zip, winrar et autre librairie 'SharpZipLib' en l'occurence que je n'aime pas trop ...
enfin, c'est toujours intéressant de voir comment ça marche, même si ce n'est pas parfait.

Cette librairie comporte 3 fonctions utile, la première =>

- LzmaArchive : Permet l'ouverture, création de l'archive, ajout de fichier/dossier, extraction en préservant ou non les dossiers, et la suppression.

- LzFileInfo : Contient toute les informations utile pour l'ajout, extraction et suppression d'un fichier compressé.

- LzFileInfoCollection : Contient quand a lui tout les LzFileInfo de l'archive qui mis a jour après chaque ajout/suppression (logique).

Pour voir un peux comment fonctionne cette librairie, j'ai ajouté un petit Forms qui va bien, très simple a utiliser et regroupe les principale fonctions.

Voilà, voilà, dite moi ce que vous en pensez, si vous avez des idées ou autre, n'hésitez pas non plus ^^

Source / Exemple :


Tout est dans le zip, j'y ait aussi inclus le SDK LZMA, la librairie en dépend et ne fonctionnera pas sans.

Conclusion :


Point positif :
- Compressions / Décompressions de fichiers en mémoire ( Image, Icon, objet sérialisé etc ... ça aide )
- Fonction de backup ( créé une copie de l'archive )
- Suppression de fichier sans devoir recréer une nouvelle archive.
- Décompression rapide.
- Compresse mieux qu'un zip ou un rar ( 7zip aussi mais c'est rare ^^' )

Point négatif :
- Compression plus ou moin lente dans certain cas.
- Aucun fichier journal en cas d'erreur.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
hi , sorry, but I speek a bad france even tough I read it.

Thank for your classes about LZMA. I was just looking for it.

I downloaded the zip and I tryed in my sharpdevelop environment , without modification, just to understand the logic of all pieces.( classes)
It compile fine , but when I launch the program and select a file I got an error: Exception o type 'system.OutOfMemoryException' was thrown.

What's wrong? I noted in debug mode than this appens at these line:

if (openFile.ShowDialog() == DialogResult.OK)
{
if (File.Exists(openFile.FileName))
{
try
{ lzArchive.Open(openFile.FileName);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Have you any suggestion about it?.
Thank for your help.
Giorgio
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi,
After some investigation, I noted that the problem maybe in this statement:

LzmaArchive lzArchive = new LzmaArchive() in lzmaForms.cs

After this statement i tested the lzArchive.ArchiveInitialized flag and it is false. This means that the lzArchive object has not been created.
How to resolve the problem ?

Do I have to use the lzma#.dll and the libCompress.dll in place of the entires projects ? or what ever else?

Thank for your help

Giorgio
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi, after several hours , it seems I have found some problems. I want to post here if someone has the same problems I had.

1. in some circumstances this function crash.
private void WriteLeInt16(Int16 value)
{
//archiveStream.WriteByte((byte)(value); --->>> crash
archiveStream.WriteByte((byte)(value & 0xFF)); --->>> Ok!
archiveStream.WriteByte((byte)(value >> 8));
}
2. When you calculate the CRC and call this function:

private void WriteCompressedSizeAndCrc(long compressedSize, uint crc32)

I don't do ...
//WriteLeInt32((Int32)crc32); -->> this truncate the value with wrong value
I create a new function
WriteLeUInt32(crc32);
private void WriteLeUInt32(uint value)
{
uint ch;
for (int i = 0; i < 4; i++) {
ch = value >> (8 * i) ;
archiveStream.WriteByte((byte)(ch & 0xFF));
}
}
after these little modification the class is starting to take place and I see some results. Now I go on , if I found something else I post here for other people.

Thank.
Giorgio
Vince_02
Messages postés
33
Date d'inscription
dimanche 15 mai 2005
Statut
Membre
Dernière intervention
14 janvier 2016
1 -
OK, je suis comme toi, je sais lire l'anglais, mais l'écrire, c'est une autre histoire ...

Pour l'erreur "OutOfRangeMemory" je pense que c'est du à la class "SevenZip", le taux de compression doit être trop élevé, enfin c'est une supposition et non une certitude.
(Plus le taux est élevé, plus cela prend de mémoire.)

Pour les 2 solutions que tu m'as apporté, je ne comprends pas pourquoi cela ne fonctionne pas pour toi, personnellement je n'ai jamais eu de problème sur ces 2 fonctions. Mais bon, j'en tiens compte pour la prochaine mise à jour.

Sur la prochaine Mise à jour, j'ai ajouté pas mal de fonction utils comme créé un SFX, un système de "Journal d'erreur" et quelque correction, ceux que tu as apporté seront inclus.
par contre je ne saurais te dire quand, actuellement j'ai moin de temps a consacré a tout ça ...
JossGP
Messages postés
7
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
15 octobre 2007
-
Hi, Vince_02

Thank you for answer.

I want to inform you about another change i made.
private UInt32 ReadLeUInt32()
{
uint Number;
uint item;
Number = ReadLeByte();
for (int i = 1; i < 4; i++)
{
item = ReadLeByte();
Number = (item << 8*i ) | Number ;
}
return Number;
}
This was necessary to read correctly a UINT number without truncation.
After that all take place in the right way.

I found very interesting your idea to add an error journal ,because it can help us to check if everything is went ok. Please inform me when you have news bout it.

Giorgio

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.