2008-10-21 12 views
8

tengo un conjunto de datos que consta de datos XML, que puede fácilmente la salida a un archivo:.NET - ¿Stream DataSet (de datos XML) a un archivo 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"); 

Sin embargo lo que yo quiero hacer es comprimir el XML en una postal u otro tipo de archivo comprimido y luego simplemente guardar este archivo en el disco mientras se divide el archivo ZIP en trozos de 1MB. Realmente no quiero guardar el archivo descomprimido, y luego comprimirlo, luego dividirlo.

Lo que estoy buscando específicamente es:

  1. una biblioteca de compresión adecuada que pueda transmitir los XML desde y tener el archivo (s) de cremallera guardado en el disco
  2. algunos ejemplos de código C# eso me puede mostrar cómo hacer esto.

Respuesta

10

He logrado comprimir una secuencia XML de DataSet usando la compresión gzip de .NET 2.0.

Aquí está la entrada del blog que hice hace algunos años en esto:

Saving DataSets Locally With Compression

... y aquí está el código añadí a mi clase parcial del conjunto de datos para escribir el archivo comprimido (el blog tiene el código de lectura también):

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

Tenga en cuenta que este código utiliza diferentes esquemas de compresión en función de la extensión del archivo. Eso fue puramente para poder probar un esquema contra el otro con mi DataSet.

+0

1 simplemente perfecto – LarsTech

1

marco incluye algunas clases para comprimir secuencias. Uno de ellos es GZipStream. Si lo buscas, encontrarás muchos éxitos. Aquí está one de ellos. Imagino que fragmentar la producción implicaría algo de trabajo adicional.

2

Esto funciona con secuencias o archivos, tiene una buena licencia y fuente: http://www.codeplex.com/DotNetZip

Aquí está el código para hacer exactamente lo que pidió a su creador original: escribir un conjunto de datos en un zip que se divide en trozos de 1 MB:

// 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

A septiembre de 2009, DotNetZip puede leer o escribir "abarcó" archivos ZIP..Si desea crear un zip dividido o distribuido, especifique el límite de tamaño para cada segmento, antes de guardarlo. A continuación, obtiene N archivos, cada uno con un tamaño que ha especificado. – Cheeso

1

Debe usar Xceed Zip. El código sería así (no probado):

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

Hay una API de envases no tan bien conocido incluye con el marco 3.5. La referencia de la Asamblea está en el GAC, llamada WindowsBase. El espacio de nombres System.IO.Packaging contiene elementos para crear archivos OPC (por ejemplo, OOXML), que son archivos zip que contienen xml y cualquier otra cosa que se desee. Obtienes algunas cosas adicionales que no necesitas, pero la clase ZipPackage usa una interfaz de transmisión para agregar contenido iterativamente.

+0

+1 System.IO.Packaging rocks! – kenny

0

DotNetZip realiza compresión de zip, a través de secuencias, pero no hace archivos zip de varias partes. :(

EDITAR: a partir de septiembre de 2009, DotNetZip puede hacer archivos zip múltiples partes

Cuestiones relacionadas