Frage

Ich habe ein DataSet von XML-Daten aus, kann ich leicht Ausgabe dieses in eine Datei:

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");

Allerdings, was ich tun möchte, ist die XML in ein ZIP oder eine andere Art von komprimierten Datei komprimieren und speichern Sie dann einfach diese Datei auf die Festplatte, während die ZIP-Datei in 1MB Stücke aufzuteilen. Ich will nicht wirklich die unkomprimierte Datei speichern, und zip es dann teilen Sie es dann.

Was ich suche speziell ist:

  1. eine geeignete Kompressionsbibliothek, die ich zu den XML-Stream kann und haben die Zip-Datei (en) auf der Festplatte gespeichert
  2. einige Beispiel-C # -Code, der mir zeigen kann, wie dies zu tun.
War es hilfreich?

Lösung

Ich habe es geschafft, eine Datenmenge durch XML-Stream zu komprimieren .NET 2.0 die gzip-Komprimierung.

Hier ist die Blog-Post mich vor ihm vor ein paar Jahren gemacht:

Speichern von Datasets vor Ort mit Kompression

... und hier ist der Code, den ich hinzugefügt, um meine DataSet partielle Klasse, um die komprimierte Datei (die Blog-Post hat den Lesecode zu) schreiben:

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

Beachten Sie, dass dieser Code verschiedene Komprimierungsverfahren verwendet, basierend auf die Erweiterung der Datei. Das war rein, damit ich mit meinem DataSet ein Schema gegen die andere testen konnte.

Andere Tipps

Es gibt einen nicht-so-bekannte Verpackung API mit dem 3.5 Framework enthalten. Die Versammlung Referenz im GAC, genannt Windows. Der System.IO.Packaging Namespace enthält Material für OPC-Dateien erstellen (z OOXML), die Zip-Dateien sind mit XML und was sonst gewünscht wird. Sie erhalten einige zusätzliche Dinge, die Sie nicht brauchen, aber die ZipPackage-Klasse verwendet eine Streaming-Schnittstelle Inhalt iterativ hinzuzufügen.

Dies funktioniert mit Streams oder Dateien, hat eine gute Lizenz und Quelle: http://www.codeplex.com / DotNetZip

Hier ist der Code zu tun genau das, was das ursprüngliche Plakat gefragt: einen DataSet in eine zip schreiben, die in 1MB Stücke aufgeteilt:

// 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);
}

enthält der Rahmen ein paar Klassen für Streams zu komprimieren. Einer von ihnen ist GZipStream. Wenn Sie danach suchen finden Sie viele Treffer finden. Hier ein von ihnen. Ich stelle mir die Ausgabe Chunking würde einige etwas zusätzliche Arbeit einzubeziehen.

Sie sollten verwenden Xceed Zip . Der Code würde wie folgt aussehen (nicht getestet):

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 tut ZIP-Komprimierung, über Bäche, aber mehrteilige ZIP-Dateien nicht tun. : (

Bearbeiten :. Stand: September 2009 DotNetZip können mehrteilige ZIP-Dateien tun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top