8

XML データで構成される DataSet があり、これをファイルに簡単に出力できます。

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

しかし、私がやりたいことは、XML を ZIP または他のタイプの圧縮ファイルに圧縮し、ZIP ファイルを 1MB のチャンクに分割しながら、このファイルをディスクに保存することです。圧縮されていないファイルを保存してから、圧縮してから分割したくありません。

私が特に探しているのは:

  1. XML をストリーミングして、zip ファイルをディスクに保存できる適切な圧縮ライブラリ
  2. これを行う方法を示すことができるいくつかのサンプル C# コード。
4

6 に答える 6

10

.NET 2.0 の gzip 圧縮を使用して、DataSet の XML ストリームを圧縮することができました。

これは、私が数年前に作成したブログ投稿です。

圧縮を使用して DataSet をローカルに保存する

...そして、圧縮ファイルを書き込むために DataSet の部分クラスに追加したコードを次に示します (ブログ投稿には読み取りコードも含まれています)。

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

このコードは、ファイルの拡張子に基づいて異なる圧縮スキームを使用することに注意してください。これは純粋に、DataSet を使用して 1 つのスキームを別のスキームに対してテストできるようにするためでした。

于 2008-10-21T22:25:42.520 に答える
2

これはストリームまたはファイルで動作し、適切なライセンスとソースがあります: http://www.codeplex.com/DotNetZip

元の投稿者が要求したことを正確に実行するコードは次のとおりです。DataSet を 1 MB のチャンクに分割された zip に書き込みます。

// 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);
}
于 2008-10-22T00:39:16.370 に答える
2

3.5 フレームワークにはあまり知られていないパッケージング API が含まれています。アセンブリ参照は、WindowsBase と呼ばれる GAC にあります。System.IO.Packaging 名前空間には、xml を含む zip ファイルである OPC ファイル (OOXML など) を作成するためのものが含まれています。必要のない余分なものがいくつか得られますが、ZipPackage クラスはコンテンツを繰り返し追加するためにストリーミング インターフェイスを使用します。

于 2008-10-22T01:57:11.313 に答える
1

Xceed Zipを使用する必要があります。コードは次のようになります (テストされていません)。

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();
}
于 2008-10-22T00:52:45.173 に答える
1

フレームワークには、ストリームを圧縮するためのいくつかのクラスが含まれています。それらの 1 つが GZipStream です。で検索するとたくさんヒットします。これがその1つです。出力をチャンク化すると、追加の作業が必要になると思います。

于 2008-10-21T22:26:01.787 に答える
0

DotNetZipは、ストリームを介してzip圧縮を行いますが、マルチパートzipファイルは行いません。:(

編集:2009年9月の時点で、DotNetZipはマルチパートzipファイルを実行できます。

于 2009-03-09T18:21:30.780 に答える