FAQ C++/CLI et VC++.Net
FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
Tout d'abord pensez à ajouter ces deux namespaces sans quoi il n'est pas possible d'utiliser le code donné en exemple.
using
namespace
System::
IO;
using
namespace
System::IO::
Compression;
Avec cet exemple il vous suffit juste de passer en paramètres le chemin complet du fichier à compresser, et ensuite le chemin de destination du fichier GZip qui va être crée.
bool
compresserFichier(String ^
cheminSource, String ^
cheminDestination)
{
/* cheminSource : chemin complet du fichier à compresser
cheminDestination : chemin complet du fichier compressé à créer*/
try
{
// Le fichier est placé dans le FileStream
FileStream ^
monFileStream =
gcnew FileStream(cheminSource, FileMode::
Open);
cli::
array<
unsigned
char
,1
>
^
monBuffer =
gcnew cli::
array<
unsigned
char
>
(safe_cast<
int
>
(monFileStream->
Length));
// Lecture de l'intégralité du FileStream
monFileStream->
Read(monBuffer, 0
, safe_cast<
int
>
(monFileStream->
Length));
// Fermeture du FileStream
monFileStream->
Close();
// Création du fichier qui va contenir le fichier compressé
monFileStream =
gcnew FileStream(cheminDestination, FileMode::
Create);
// Compression des données
GZipStream ^
monGZipStream =
gcnew GZipStream(monFileStream, CompressionMode::
Compress, false
);
// Ecriture des données compressées dans le fichier de destination
monGZipStream->
Write(monBuffer, 0
, monBuffer->
Length);
// Fermeture du GZipStream
monGZipStream->
Close();
return
true
;
}
catch
(Exception ^
e)
{
Console::
WriteLine(e->
Message);
return
false
;
}
}
Lien : System.IO.Compression
Tout d'abord pensez à ajouter ces deux namespaces sans quoi il n'est pas possible d'utiliser le code donné en exemple.
using
namespace
System::
IO;
using
namespace
System::IO::
Compression;
Avec cet exemple il vous suffit juste de passer en paramètres le chemin complet du fichier GZip à décompresser, et ensuite le chemin de destination du fichier qui va être décompressé.
bool
decompression(String ^
cheminSource, String ^
cheminDestination)
{
/*cheminSource : chemin complet du fichier compressé
cheminDestination : chemin complet du fichier où le fichier doit être décompressé*/
try
{
// Lecture du fichier compresse
FileStream ^
monFileStream =
gcnew FileStream(cheminSource, FileMode::
Open);
// Données du fichier placées dans un GZipStream
GZipStream ^
monGzipStream =
gcnew GZipStream(monFileStream, CompressionMode::
Decompress);
// Tableau qui va contenir la taille du fichier
array <
unsigned
char
>
^
tailleOctets =
gcnew array<
unsigned
char
>
(4
);
// Positionnement dans le Stream pour récupérer la taille
int
position =
safe_cast<
int
>
(monFileStream->
Length) -
4
;
monFileStream->
Position =
position;
// Récupération de la taille du fichier
monFileStream->
Read(tailleOctets, 0
, 4
);
// Repositionnement en début du Stream
monFileStream->
Position =
0
;
// Conversion de la taille du fichier en entier
int
tailleFichier =
BitConverter::
ToInt32(tailleOctets, 0
);
// Dimesionnement du buffer
array<
unsigned
char
>
^
buffer =
gcnew array<
unsigned
char
>
(tailleFichier +
100
);
// Offset qui permettra de se repérer dans le Stream
int
monOffset =
0
;
while
(true
)
{
// Les données sont décompressées et placées dans le buffer
int
decompressionOctets =
monGzipStream->
Read(buffer, monOffset, 100
);
// Tant qu'il reste des données on continue
if
(!
decompressionOctets)
break
;
// On icrémente l'offset pour ne pas repartir de 0 à chaque fois...
monOffset +=
decompressionOctets;
}
// Création du fichier décompressé
monFileStream =
gcnew FileStream(cheminDestination, FileMode::
Create);
// Ecriture des données décomrpessées dans le fichier
monFileStream->
Write(buffer, 0
, tailleFichier);
// Efface les données en mémoire tampon
monFileStream->
Flush();
// Fermeture des Streams
monFileStream->
Close();
monGzipStream->
Close();
return
true
;
}
catch
(Exception ^
e)
{
Console::
WriteLine(e->
Message);
return
false
;
}
}
Lien : System.IO.Compression