كيفية استخدام النظام.IO.ضغط قراءة/كتابة الرمز البريدي الملفات ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

أعرف أن هناك المكتبات هناك للعمل مع الملفات المضغوطة.ويمكنك بدلا من ذلك استخدام وظائف المضمنة في نظام التشغيل Windows للعمل ملفات ZIP.

ولكن أنا أتساءل عما اذا كان أي شخص قد عملت على كيفية استخدام الأدوات المضمنة في النظام.IO.ضغط مساحة داخل .صافي للقراءة/الكتابة الرمز البريدي الملفات ؟ أو هو غير ممكن فقط باستخدام هذا الاسم?

تحديث:لقد يبدو شخص ما تعليق النظام.IO.التعبئة والتغليف مساحة قد تكون مفيدة مع هذا أيضا.لا أحد يعرف بالضبط كيف نفعل ذلك ؟

هل كانت مفيدة؟

المحلول

MSDN كاملة على سبيل المثال http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx باستخدام ZipPackage الدرجة.يتطلب .NET framework 3.5.

نصائح أخرى

ديف لطيفة جدا!!لم أكن أعرف أنه كان هناك.

الآن بعد أن كنت تعرف ما الذي تبحث عنه, وكنت قادرا على العثور على المادة مع رمز صغير العينة على كيفية استخدامها:http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

على صعيد متصل وجدت أيضا DotNetZip المشروع التي تبدو سهلة الاستخدام للغاية.

سوف تحتاج إلى استخدام طرف ثالث مكتبة, مثل http://www.codeplex.com/DotNetZip, بدلا من محاولة استخدام GZipStream أو DeflateStream قراءة ملف مضغوط.

ال ***تيار في الطبقات .صافي يمكن أن تتيح لك قراءة أو كتابة ضغط تيارات بايت.هذه الفئات لا قراءة أو كتابة الملفات المضغوطة.ملف مضغوط يتم ضغط البيانات محاطة "مغلف" أو رأس.أعتقد أنها الفوقية - ويشمل اسم الملف الزمني ، اتفاقية حقوق الطفل ، و مجموعة من الأشياء الأخرى.على **تيار الطبقات تنتج سوى تيار من البيانات المضغوطة و لا تعرف كيف تنتج أو تستهلك البيانات الوصفية ، الذي يوصف في PKZip شكل مواصفات تحتفظ بها PKWare.

طرف ثالث المكتبات مثل DotNetZip التعامل مع البيانات الوصفية في أرشيف مضغوط.قد أو قد لا تستخدم النظام.IO.ضغط.DeflateStream() الطبقة المنتجة المضغوط تيار بايت.في الإصدارات السابقة ، على سبيل المثال ، DotNetZip استخدام المدمج في DeflateStream.كما v1.7, DotNetZip يتضمن الخاصة DeflateStream التي هي أكثر كفاءة من واحد شحنها في .NET Framework.كما ميزة إضافية, جزءا لا يتجزأ من DeflateStream في DotNetZip يسمح DotNetZip استخدامها على .NET Compact Framework 2.0 التي تفتقر إلى النظام.IO.ضغط.DeflateStream.(تم إضافته في ضغط Framework 3.5)

هناك منتدى جيد على DotNetZip الموقع إذا كان لديك المزيد من الأسئلة.المثال التعليمات البرمجية C#:

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }

منذ .NET 4.5, مايكروسوفت قد عرضت ZipArchive فئة إلى System.IO.Compression مساحة الاسم.على عكس غيرها من الفئات في مساحة الاسم ، على الرغم من مثل GZipStream و Deflate تيار ، ZipArchive يتطلب الإشارة إلى System.IO.Compression.dll الجمعية.

انها بسيطة نسبيا للاستخدام ، على الرابط أعلاه إلى MSDN توفر بعض الأمثلة الجيدة.

بالإضافة إلى ذلك, قامت Microsoft بإنشاء مايكروسوفت ضغط حزمة NuGet, الذي يضيف دعم ZipArchive وما يتصل بها من دروس ويندوز فون 8 و المحمولة الأخرى مكتبات فئة

قديم الموضوع, أعلم, ولكن أود أن أشير إلى ذلك .NET 4.5 وأضاف واسعة من التحسينات إلى نظام.io.ضغط.فإنه يمكن الآن التعامل مع .الرمز البريدي الملفات بشكل جيد جدا حتى فضح الملفات الفردية داخل الرمز البريدي تيارات أو قادرة على القراءة والكتابة دون خطوة استخراج ضغط الملفات.

نعم ، لقد استعملت في الماضي.أنا الفرعية حسنه DataSet مرة واحدة لدعم استمرار نفسها إلى ملف (عبر ReadXML/WriteXML طريقة).اضاف باعتبارها مكافأة, قررت أن تسمح لها أن تكون ، اختياريا ، المضغوط إذا رغبت في ذلك (هذا ، كما يجب أن تعرف بالفعل ، هو فعالة للغاية مع البيانات النصية مثل XML).

لقد استخدمت GZipStream فئة (كان فهمي في ذلك الوقت أن DeflateStream كان مجرد GZip دون معلومات رأس أو بعض هذه — أنا متأكد من شخص ما يمكن أن تصحح لي على هذا).يعمل ببساطة عن طريق بيجي-النسخ على رأس تيار آخر وهكذا يمكنك ثم استخدام GZipStream في مكانها.في حالتي كان أصبع-النسخ على FileStream.

نظرا MemoryStream أن تكون مليئة إخراج myDataSet.WriteXML(), لقد فعلت شيئا من هذا القبيل ما يلي:

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

حيث Save() و Pump() طرق بسيطة كما يلي:

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
    public static void zIpDatabseFile(string srcPath, string destPath)
    {//This is for  Zip a File
        using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(dest, CompressionMode.Compress))
        {
            source.CopyTo(zip);
        }
    }
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
    {// This is for unzip a files.
        using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(source, CompressionMode.Decompress))
        {
            zip.CopyTo(dest);
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top