.صافي تيار بيانات (XML البيانات) إلى الرمز البريدي الملف ؟

StackOverflow https://stackoverflow.com/questions/223738

  •  03-07-2019
  •  | 
  •  

سؤال

لدي مجموعة بيانات تتكون من بيانات 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 في الرمز البريدي أو أي نوع آخر من الملف المضغوط ثم حفظ هذا الملف إلى القرص أثناء تقسيم الملف المضغوط الى 1MB قطع.أنا لا حقا تريد حفظ ملف مضغوط ثم أغلقها, ثم تقسيمه.

ما أبحث عنه بالتحديد هو:

  1. مناسبة ضغط المكتبة أستطيع أن دفق XML و يكون ملف مضغوط(s) حفظها إلى القرص
  2. بعض نماذج التعليمات البرمجية C# التي يمكن أن تظهر لي كيفية القيام بذلك.
هل كانت مفيدة؟

المحلول

لقد تمكنت من ضغط بيانات XML باستخدام تيار .NET 2.0 ضغط gzip.

وهنا بلوق وظيفة صنعت قبل بضع سنوات حول هذا الموضوع:

توفير البيانات محليا مع ضغط

...وهنا رمز أضفت إلى البيانات الجزئية من الدرجة كتابة ملف مضغوط (بلوق وظيفة لديه قراءة رمز أيضا):

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

علما أن هذا الرمز يستخدم ضغط مختلفة مخططات بناء على ملحق اسم الملف.كان ذلك محض حتى أتمكن من اختبار مخطط واحد ضد الآخر مع البيانات.

نصائح أخرى

هناك غير معروفة التعبئة والتغليف API تضمينها مع 3.5 إطار عمل.الجمعية المرجعية في GAC ، ودعا WindowsBase.النظام.IO.التعبئة والتغليف مساحة يحتوي على الاشياء لخلق OPC الملفات (على سبيل المثالOOXML) ، والتي هي ملفات مضغوطة تحتوي xml و ما هو المطلوب.يمكنك الحصول على بعض الأشياء الإضافية التي لا تحتاج إليها ، ولكن 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.إذا كنت ابحث ستجد الكثير من الزيارات.هنا واحد منهم.أتصور chunking الإخراج ينطوي على بعض العمل الإضافي.

يجب عليك استخدام وشركة أكسيد الرمز البريدي.رمز تبدو مثل هذا (لم تختبر):

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 لا ضغط zip, عبر تيارات لكن لا multi-الجزء ملفات zip.:(

تحرير:اعتبارا من أيلول / سبتمبر 2009 ، DotNetZip يمكن أن تفعل متعددة الأجزاء ملفات zip.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top