לעתים קרובות, אתה מקבל ארכיון ZIP שמכיל בתוכו ארכיוני ZIP אחרים שיוצרים מבנה מקונן של הארכיונים. במקרים כאלה, ייתכן שתרצה לקבל מבנה שטוח על ידי חילוץ כל ארכיוני ה-ZIP הפנימיים לארכיון החיצוני. כדי לבצע פעולה זו באופן פרוגרמטי, מאמר זה מראה כיצד ליצור ארכיון ZIP שטוח ב-C#.

C# .NET API ליצירת ארכיוני ZIP שטוחים

כדי ליצור את ארכיוני ה-ZIP השטוחים, נשתמש ב-Aspose.ZIP עבור .NET. זהו API לארכיון שנועד ליצור ולחלץ פורמטי ארכיון פופולריים כולל ZIP, TAR, GZip ו-7z. אתה יכול להתקין את ה-API מ-NuGet או להוריד את ה-DLL שלו מסעיף ההורדות.

PM> Install-Package Aspose.Zip

צור ארכיון ZIP שטוח ב-C#

כדי להבין את המבנה של ארכיון ZIP שטוח, ניקח דוגמה. להלן ארכיון ZIP המכיל בתוכו ארכיון ZIP נוסף.

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

לאחר הפיכת ארכיון ה-ZIP הזה ל-ZIP שטוח, כל הערכים של ה-ZIP הפנימי יחולצו ל-ZIP האב. לבסוף, נקבל את המבנה הבא של ZIP האב.

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

בואו נראה כיצד לבצע את השינוי הזה באופן תוכניתי. להלן השלבים ליצירת ארכיון ZIP שטוח ב-C#.

  • ראשית, טען את ארכיון האב ZIP באמצעות המחלקה Archive.
  • לאחר מכן, צור רשימות כדי לאחסן את ערכי ה-ZIP הפנימיים כדי למחוק מה-ZIP האב, הערכים שחולצו ושמותיהם.
  • לאחר מכן, בצע לולאה דרך כל ArchiveEntry ב-ZIP האב באמצעות אוסף Archive.Entries.
  • עבור כל ערך, בצע את הפעולות הבאות:
    • בדוק אם הערך הוא ארכיון ZIP בשיטת ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
    • לאחר מכן, הוסף ערך לרשימת הערכים שיש למחוק.
    • פתח כניסה לאובייקט MemoryStream באמצעות שיטת ArchiveEntry.Open().CopyTo(MemoryStream).
    • חזור על הערכים של ארכיון ZIP הפנימי ובכל איטרציה, בצע את השלבים הבאים.
      • הוסף את שם הערך לרשימת הערכים שיש להוסיף.
      • לאחר מכן, טען ערך ל-MemoryStream באמצעות שיטת ArchiveEntry.Open().CopyTo(MemoryStream).
      • לבסוף, הוסף ערך לרשימת הערכים שיתווספו ל- ZIP האב.
  • לאחר מכן, בצע לולאה ברשימת ארכיוני ה-ZIP הפנימיים ומחק כל ערך באמצעות שיטת Archive.DeleteEntry(ArchiveEntry).
  • עברו בלולאה ברשימת הערכים שיש להוסיף ל-ZIP האב והוסיפו כל ערך בשיטת Archive.CreateEntry(String, Stream).
  • לבסוף, שמור את ארכיון האב ZIP באמצעות שיטת Archive.Save(String).

דוגמת הקוד הבאה מראה כיצד ליצור ארכיון ZIP שטוח ב-C#.

// טען ארכיון ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // צור רשימה למחיקת ערכי ZIP פנימיים לאחר חילוץ
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // צור רשימה כדי להוסיף שמות של קבצים בארכיוני ZIP פנימיים
    List<string> namesToInsert = new List<string>();

    // צור רשימה להוספת אובייקטי זרם של קבצים בארכיוני ZIP פנימיים
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // עברו בלולאה בין ערכים ב-ZIP האב
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // בדוק אם הערך הוא קובץ ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // הוסף ערך לרשימה כדי לשמור הפניה כדי להסיר אותה מהארכיון מאוחר יותר
            entriesToDelete.Add(entry); 

            // צור אובייקט זרם כדי לפתוח את ארכיון ה-ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // טען את ארכיון ה-ZIP מאובייקט הזרם 
            using (Archive inner = new Archive(innerCompressed))
            {
                // עברו בלולאה על ערכי הארכיון
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // שמור את שם הערך ברשימה
                    namesToInsert.Add(ie.Name); 

                    // חלץ ערך ארכיון לאובייקט זרם
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // הוסף ערך לרשימה
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // מחק את ארכיון ה-ZIP הפנימי
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // הכנס את הקבצים של ארכיוני ZIP פנימיים לארכיון ההורה ZIP
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

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

קבל רישיון API בחינם

אתה יכול לקבל [רישיון זמני] בחינם14 לשימוש ב-Aspose.ZIP עבור .NET ללא מגבלות הערכה.

סיכום

במאמר זה, למדת כיצד ליצור ארכיון ZIP שטוח באופן תכנותי ב-C#. במיוחד, הדגמנו כיצד ליצור ZIP שטוח על ידי חילוץ ארכיוני ה-ZIP הפנימיים לתוך ה-ZIP האב. מלבד זאת, אתה יכול לבקר בתיעוד כדי לקרוא עוד על Aspose.ZIP עבור .NET. כמו כן, אתה יכול לשתף אותנו בשאילתות שלך דרך הפורום שלנו.

ראה גם