Thông thường, bạn nhận được tệp lưu trữ ZIP chứa các tệp lưu trữ ZIP khác bên trong nó tạo thành cấu trúc lồng nhau của các tệp lưu trữ. Trong những trường hợp như vậy, bạn có thể muốn có một cấu trúc phẳng bằng cách giải nén tất cả các kho lưu trữ ZIP bên trong vào kho lưu trữ bên ngoài. Để thực hiện thao tác này theo chương trình, bài viết này hướng dẫn cách tạo một kho lưu trữ ZIP phẳng trong C#.

C# .NET API để tạo kho lưu trữ ZIP phẳng

Để tạo các kho lưu trữ ZIP phẳng, chúng tôi sẽ sử dụng Aspose.ZIP cho .NET. Đây là một API lưu trữ được thiết kế để tạo và trích xuất các định dạng lưu trữ phổ biến bao gồm ZIP, TAR, GZip và 7z. Bạn có thể cài đặt API từ NuGet hoặc tải xuống DLL của nó từ phần tải xuống.

PM> Install-Package Aspose.Zip

Tạo kho lưu trữ ZIP phẳng trong C#

Để hiểu cấu trúc của một kho lưu trữ ZIP phẳng, hãy lấy một ví dụ. Sau đây là một kho lưu trữ ZIP có chứa một kho lưu trữ ZIP khác bên trong nó.

parent.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.gif

Sau khi chuyển đổi tệp nén ZIP này thành tệp ZIP phẳng, tất cả các mục nhập của tệp ZIP bên trong sẽ được trích xuất vào tệp ZIP gốc. Cuối cùng, chúng ta sẽ nhận được cấu trúc sau của ZIP gốc.

flatten.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.bin

Hãy xem cách thực hiện chuyển đổi này theo chương trình. Sau đây là các bước để tạo một kho lưu trữ ZIP phẳng trong C#.

  • Đầu tiên, tải tệp lưu trữ ZIP gốc bằng cách sử dụng lớp Lưu trữ.
  • Sau đó, tạo danh sách để lưu trữ các mục ZIP bên trong để xóa khỏi ZIP gốc, các mục đã trích xuất và tên của chúng.
  • Sau đó, lặp qua từng ArchiveEntry trong ZIP gốc bằng cách sử dụng bộ sưu tập Archive.Entries.
  • Đối với mỗi mục nhập, hãy thực hiện các thao tác sau:
    • Kiểm tra xem mục nhập có phải là tệp lưu trữ ZIP hay không bằng phương pháp ArchiveEntry.Name.EndsWith (". Zip", StringComparison.InvariantCultureIgnoreCase)).
    • Sau đó, thêm mục nhập vào danh sách mục cần xóa.
    • Mở mục nhập vào đối tượng MemoryStream bằng phương thức ArchiveEntry.Open(). CopyTo (MemoryStream).
    • Lặp lại thông qua các mục nhập của kho lưu trữ ZIP bên trong và trong mỗi lần lặp lại, hãy thực hiện các bước sau.
      • Thêm tên mục nhập vào danh sách mục nhập cần thêm.
      • Sau đó, tải mục nhập vào MemoryStream bằng phương thức ArchiveEntry.Open(). CopyTo (MemoryStream).
      • Cuối cùng, thêm mục nhập vào danh sách các mục nhập sẽ được thêm vào ZIP cha.
  • Sau đó, lặp qua danh sách các kho lưu trữ ZIP bên trong và xóa từng mục nhập bằng phương thức Archive.DeleteEntry (ArchiveEntry).
  • Lặp lại danh sách các mục nhập sẽ được thêm vào ZIP gốc và thêm từng mục nhập bằng phương thức Archive.CreateEntry (String, Stream).
  • Cuối cùng, lưu kho lưu trữ ZIP gốc bằng phương thức Archive.Save (String).

Mẫu mã sau đây cho thấy cách tạo một kho lưu trữ ZIP phẳng trong C#.

// Tải kho lưu trữ ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Tạo danh sách để xóa các mục ZIP bên trong sau khi trích xuất
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Tạo danh sách để thêm tên tệp trong kho lưu trữ ZIP bên trong
    List<string> namesToInsert = new List<string>();

    // Tạo danh sách để thêm các đối tượng luồng của tệp trong kho lưu trữ ZIP bên trong
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Lặp lại các mục nhập trong ZIP gốc
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Kiểm tra xem mục nhập có phải là tệp ZIP không
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Thêm mục nhập vào danh sách để giữ tài liệu tham khảo nhằm xóa mục đó khỏi kho lưu trữ sau này
            entriesToDelete.Add(entry); 

            // Tạo đối tượng luồng để mở kho lưu trữ ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Tải tệp lưu trữ ZIP từ đối tượng luồng 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Lặp lại các mục nhập của kho lưu trữ
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Giữ tên mục nhập trong danh sách
                    namesToInsert.Add(ie.Name); 

                    // Trích xuất mục nhập lưu trữ vào một đối tượng luồng
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Thêm mục vào danh sách
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Xóa các kho lưu trữ ZIP bên trong
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Chèn các tệp của kho lưu trữ ZIP bên trong vào kho lưu trữ ZIP gốc
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

Nhận giấy phép API miễn phí

Bạn có thể nhận giấy phép tạm thời miễn phí để sử dụng Aspose.ZIP cho .NET mà không có giới hạn đánh giá.

Sự kết luận

Trong bài viết này, bạn đã học cách tạo một kho lưu trữ ZIP phẳng theo lập trình trong C#. Đặc biệt, chúng tôi đã trình bày cách tạo một tệp ZIP phẳng bằng cách giải nén các tệp nén ZIP bên trong vào tệp ZIP gốc. Ngoài ra, bạn có thể truy cập tài liệu để đọc thêm về Aspose.ZIP cho .NET. Ngoài ra, bạn có thể chia sẻ các thắc mắc của mình với chúng tôi qua diễn đàn của chúng tôi.

Xem thêm