2008-10-21 6 views
8

j'ai un DataSet composé de données XML, je peux facilement la sortie à un fichier:.NET - Stream DataSet (des données XML) au fichier ZIP?

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 faire est de compresser le fichier XML dans un fichier ZIP ou tout autre type de fichier compressé et puis juste enregistrer ce fichier sur le disque tout en séparant le fichier ZIP en morceaux de 1 Mo. Je ne veux pas vraiment enregistrer le fichier non compressé, puis le compresser, puis le scinder.

Ce que je suis à la recherche spécifiquement est:

  1. une bibliothèque de compression appropriée que je peux diffuser le XML et que le fichier zip (s) enregistré sur le disque
  2. un certain échantillon de code C# cela peut me montrer comment faire ça.

Répondre

10

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

Voici le blog que j'ai fait il y a quelques années à ce sujet:

Saving DataSets Locally With Compression

... et voici le code que j'ajouté à ma classe partielle de DataSet pour écrire le fichier compressé (le billet de blog a le code de lecture trop):

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 systèmes de compression en fonction de l'extension du fichier. C'était purement pour que je puisse tester un schéma contre l'autre avec mon DataSet.

+0

+1 parfait – LarsTech

1

la structure comprend quelques classes pour la compression des flux. L'un d'eux est GZipStream. Si vous le recherchez, vous trouverez beaucoup de hits. Voici one d'entre eux. J'imagine que le découpage de la production impliquerait du travail supplémentaire.

2

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

Voici le code pour faire exactement ce que l'affiche originale a demandé: écrire un DataSet dans un zip qui est 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); 
} 
+0

En Septembre 2009, DotNetZip peut lire ou écrire "Spanned" les fichiers ZIP..Si vous souhaitez créer un zip fractionné ou fractionné, vous spécifiez la limite de taille pour chaque segment avant de l'enregistrer. Vous obtenez alors N fichiers, chacun avec une taille que vous avez spécifié. – Cheeso

1

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(); 
} 
2

Il existe une API d'emballage pas si bien connu inclus dans le cadre 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 tout ce qui est souhaité. Vous obtenez des choses supplémentaires dont vous n'avez pas besoin, mais la classe ZipPackage utilise une interface de diffusion pour ajouter du contenu par itération.

+0

+1 System.IO.Packaging rocks! – kenny

0

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

EDIT: à partir de Septembre 2009, DotNetZip peut faire des fichiers zip en plusieurs parties

Questions connexes