کتابخانه SharpCompress سی شارپ – فشرده سازی فایل

SharpCompress، یک کتابخانه‌ی فشرده‌‌سازی فایل نوشته شده به زبان سی شارپ، برای .NET Standard 1.3 & 2.0 هست که می‌تواند عملیات unrar, un7zip, unzip, untar, unbzip2 و ungzip (خارج کردن فایل از حالت فشرده) را نیز انجام داده و همچنین امکان ایجاد این فایل‌ها (zip/tar/bzip2/gzip) را نیز دارد. (مشاهده لیست فرمت‌های پشتیبانی شده)

ویژگی اصلی، پشتیبانی برای استریم‌های non-seekable است؛ لذا فایل‌های بزرگ می‌توانند در هوا پردازش شوند. (منظور استریم دانلود است)

نصب و راه اندازی

در محیط ویژوال استودیو و پروژه‌ی خود، از منوی Tools، وارد NuGet Package Manager شده و روی Package Manager Console کلیک کنید. دستور زیر را تایپ کرده و Enter  را بزنید تا کتابخانه نصب شود:

Install-Package sharpcompress

روش استفاده

ایجاد آرشیو ZIP از تمامی فایل‌های موجود در یک دایرکتوری:

using (var archive = ZipArchive.Create())
{
    archive.AddAllFromDirectory("D:\\temp");
    archive.SaveTo("C:\\temp.zip", CompressionType.Deflate);
}

ابتدا یک ZipArchive ایجاد کرده و سپس به کمک متد AddAllFromDirectory، دایرکتوری مورد نظر را به آن معرفی و در نهایت با متد SaveTo، مسیر ذخیره را تعیین می‌کنیم.


ایجاد آرشیو ZIP از تمامی فایل‌های موجود در یک دایرکتوری و ذخیره‌ی آن در مموری:

var memoryStream = new MemoryStream();
using (var archive = ZipArchive.Create())
{
    archive.AddAllFromDirectory("D:\\temp");
    archive.SaveTo(memoryStream, new WriterOptions(CompressionType.Deflate)
                                {
                                    LeaveStreamOpen = true
                                });
}
//reset memoryStream to be usable now
memoryStream.Position = 0;

در اینجا برخلاف قبل، داده‌ی فشرده شده، درون مموری سیستم نگهداری می‌شود.


استخراج تمامی فایل‌های داخل یک فایل RAR به یک دایرکتوری دلخواه:

using (var archive = RarArchive.Open("Test.rar"))
{
    foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory))
    {
        entry.WriteToDirectory("D:\\temp", new ExtractionOptions()
        {
            ExtractFullPath = true,
            Overwrite = true
        });
    }
}

استفاده از ReaderFactory برای تشخیص خودکار نوع آرشیو و باز کردن جریان ورود:

using (Stream stream = File.OpenRead("Tar.tar.bz2"))
using (var reader = ReaderFactory.Open(stream))
{
    while (reader.MoveToNextEntry())
    {
        if (!reader.Entry.IsDirectory)
        {
            Console.WriteLine(reader.Entry.Key);
            reader.WriteEntryToDirectory(@"C:\temp", new ExtractionOptions()
            {
                ExtractFullPath = true,
                Overwrite = true
            });
        }
    }
}

مثال دیگر:

using (Stream stream = File.OpenRead("Tar.tar.bz2"))
using (var reader = ReaderFactory.Open(stream))
{
    while (reader.MoveToNextEntry())
    {
        if (!reader.Entry.IsDirectory)
        {
            using (var entryStream = reader.OpenEntryStream())
            {
                entryStream.CopyTo(...);
            }
        }
    }
}

استفاده از WriterFactory برای نوشتن همه فایل‌های یک دایرکتوری در یک streaming manner:

using (Stream stream = File.OpenWrite("C:\\temp.tgz"))
using (var writer = WriterFactory.Open(stream, ArchiveType.Tar, new WriterOptions(CompressionType.GZip)
                                                {
                                                    LeaveOpenStream = true
                                                }))
{
    writer.WriteAll("D:\\temp", "*", SearchOption.AllDirectories);
}

استخراج ZIP ای که نام فایل‌های آن،  انکدینگ utf8 ندارد (cp932):

var opts = new SharpCompress.Readers.ReaderOptions();
var encoding = Encoding.GetEncoding(932);
opts.ArchiveEncoding = new SharpCompress.Common.ArchiveEncoding();
opts.ArchiveEncoding.CustomDecoder = (data, x, y) =>
{
    return encoding.GetString(data);
};
var tr = SharpCompress.Archives.Zip.ZipArchive.Open("test.zip", opts);
foreach(var entry in tr.Entries)
{
    Console.WriteLine($"{entry.Key}");
}

صفحات رسمی

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

cp-codfk

نظرات ثبت شده بدون دیدگاه

توضیحات پیشنهادی نظرات اشتراک