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 را بزنید تا کتابخانه نصب شود:
1 |
Install-Package sharpcompress |
روش استفاده
ایجاد آرشیو ZIP از تمامی فایلهای موجود در یک دایرکتوری:
1 2 3 4 5 |
using (var archive = ZipArchive.Create()) { archive.AddAllFromDirectory("D:\\temp"); archive.SaveTo("C:\\temp.zip", CompressionType.Deflate); } |
ابتدا یک ZipArchive ایجاد کرده و سپس به کمک متد AddAllFromDirectory، دایرکتوری مورد نظر را به آن معرفی و در نهایت با متد SaveTo، مسیر ذخیره را تعیین میکنیم.
ایجاد آرشیو ZIP از تمامی فایلهای موجود در یک دایرکتوری و ذخیرهی آن در مموری:
1 2 3 4 5 6 7 8 9 10 11 |
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 به یک دایرکتوری دلخواه:
1 2 3 4 5 6 7 8 9 10 11 |
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 برای تشخیص خودکار نوع آرشیو و باز کردن جریان ورود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 }); } } } |
مثال دیگر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 2 3 4 5 6 7 8 |
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):
1 2 3 4 5 6 7 8 9 10 11 12 |
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}"); } |
نظرات ثبت شده بدون دیدگاه