Question

J'ai un DataSet composé de données XML, je peux facilement le sortir dans un fichier:

DataSet ds = new DataSet();
DataTable dt = new DataTable();
ds.Tables.Add(dt);
ds.Load(reader, LoadOption.PreserveChanges, ds.Tables[0]);
ds.WriteXml("C:\\test.xml");

Cependant, ce que je veux, c’est compresser le code XML dans un fichier ZIP ou un autre type de fichier compressé, puis sauvegarder ce fichier sur un disque tout en fractionnant le fichier ZIP en morceaux de 1 Mo. Je ne souhaite pas vraiment enregistrer le fichier non compressé, puis le compresser, puis le diviser.

Ce que je recherche précisément, c'est:

  1. une bibliothèque de compression appropriée vers laquelle je peux diffuser le code XML et enregistrer le (s) fichier (s) zip sur un disque
  2. un exemple de code C # qui peut me montrer comment faire cela.
Était-ce utile?

La solution

J'ai réussi à compresser le flux XML d'un DataSet à l'aide de la compression gzip de .NET 2.0.

Voici le blog que j'ai publié il y a quelques années:

Enregistrement de jeux de données localement avec compression

... et voici le code que j'ai ajouté à la classe partielle de mon DataSet pour écrire le fichier compressé (l'article de blog contient également le code de lecture):

public void WriteFile(string fileName)
{
    using (FileStream fs = new FileStream(fileName, FileMode.Create))
    {
        Stream s;
        if (Path.GetExtension(fileName) == ".cmx")
        {
            s = new GZipStream(fs, CompressionMode.Compress);
        }
        else if (Path.GetExtension(fileName) == ".cmz")
        {
            s = new DeflateStream(fs, CompressionMode.Compress);
        }
        else
        {
            s = fs;
        }
        WriteXml(s);
        s.Close();
    }
} 

Notez que ce code utilise différents schémas de compression basés sur l'extension du fichier. C’était purement pour pouvoir tester un schéma contre un autre avec mon DataSet.

Autres conseils

Il existe une API de packaging peu connue, incluse dans la structure 3.5. La référence d'assembly est dans le GAC, appelée WindowsBase. L'espace de noms System.IO.Packaging contient des éléments permettant de créer des fichiers OPC (par exemple, OOXML), qui sont des fichiers zip contenant xml et ainsi de suite. Vous obtenez des éléments supplémentaires dont vous n’avez pas besoin, mais la classe ZipPackage utilise une interface de diffusion en continu pour ajouter du contenu de manière itérative.

Cela fonctionne avec les flux ou les fichiers, a une bonne licence et la source: http://www.codeplex.com / DotNetZip

Voici le code permettant de faire exactement ce que l'affiche originale a demandé: écrivez un ensemble de données dans un fichier zip divisé en morceaux de 1 Mo:

// get connection to the database
var c1= new System.Data.SqlClient.SqlConnection(connstring1);
var da = new System.Data.SqlClient.SqlDataAdapter()
{
    SelectCommand= new System.Data.SqlClient.SqlCommand(strSelect, c1)
};

DataSet ds1 = new DataSet();

// fill the dataset with the SELECT 
da.Fill(ds1, "Invoices");

// write the XML for that DataSet into a zip file (split into 1mb chunks)
using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
{
    zip.MaxOutputSegmentSize = 1024*1024;
    zip.AddEntry(zipEntryName, (name,stream) => ds1.WriteXml(stream) );
    zip.Save(zipFileName);
}

le framework inclut quelques classes pour la compression des flux. L'un d'eux est GZipStream. Si vous le recherchez, vous trouverez beaucoup de résultats. Voici un d'entre eux. J'imagine que couper la sortie impliquerait du travail supplémentaire.

Vous devez utiliser Xceed Zip . Le code ressemblerait à ceci (non testé):

ZipArchive archive = new ZipArchive( new DiskFile( @"c:\path\file.zip" ) );

archive.SplitSize = 1024*1024;
archive.BeginUpdate();

try
{
  AbstractFile destFile = archive.GetFile( "data.xml" );

  using( Stream stream = destFile.OpenWrite( true ) )
  {
    ds.WriteXml( stream );
  }
}
finally
{
  archive.EndUpdate();
}

DotNetZip effectue la compression zip, via des flux, mais pas les fichiers zip en plusieurs parties. : (

MODIFIER : à compter de septembre 2009, DotNetZip peut créer des fichiers zip en plusieurs parties.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top