문제

XML 데이터로 구성된 데이터 세트가 있으며 파일에 쉽게 출력 할 수 있습니다.

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# 코드.
도움이 되었습니까?

해결책

.NET 2.0의 GZIP 압축을 사용하여 데이터 세트의 XML 스트림을 압축했습니다.

몇 년 전에 제가 만든 블로그 게시물은 다음과 같습니다.

압축으로 로컬로 데이터 세트를 저장합니다

... 여기에 압축 파일을 작성하기 위해 데이터 세트의 부분 클래스에 추가 한 코드가 있습니다 (블로그 게시물에는 읽기 코드도 있습니다).

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

이 코드는 파일의 확장자를 기반으로 다른 압축 체계를 사용합니다. 그것은 순전히 데이터 세트를 사용하여 다른 체계에 대해 하나의 체계를 테스트 할 수있었습니다.

다른 팁

3.5 프레임 워크에 포함 된 알려지지 않은 포장 API가 있습니다. 어셈블리 참조는 GAC (Windowsbase)에 있습니다. System.io.packaging 네임 스페이스에는 OPC 파일 (예 : OOXML)을 만들기위한 것들이 포함되어 있으며 XML이 포함 된 ZIP 파일 및 원하는 모든 것을 포함합니다. 필요하지 않은 추가 제품을 얻을 수 있지만 Zippackage 클래스는 컨텐츠를 반복적으로 추가하기 위해 스트리밍 인터페이스를 사용합니다.

이것은 스트림이나 파일과 함께 작동하며 라이센스가 양호하고 출처가 있습니다. http://www.codeplex.com/dotnetzip

원래 포스터가 요청한 내용을 정확하게 수행하는 코드는 다음과 같습니다. 1MB 청크로 분할되는 지퍼에 데이터 세트를 작성하십시오.

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

프레임 워크에는 스트림 압축을위한 몇 가지 클래스가 포함되어 있습니다. 그들 중 하나는 gzipstream입니다. 검색하면 많은 히트 곡을 찾을 수 있습니다. 여기에 있습니다 하나 그들의. 출력을 청킹하는 데 몇 가지 추가 작업이 포함될 것이라고 생각합니다.

당신은 사용해야합니다 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();
}

dotnetzip 스트림을 통해 압축을 압축하지만 멀티 부품 지퍼 파일을 수행하지는 않습니다. :(

편집하다: 2009 년 9 월 현재, DotNetZip은 다중 부분 지퍼 파일을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top