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
Sommaire→Intéraction du C++/CLI avec le framework .Net→Fichiers, Répertoires, Disques→CompressionTout 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



