לעתים קרובות, אתה מקבל ארכיון 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. כמו כן, אתה יכול לשתף אותנו בשאילתות שלך דרך הפורום שלנו.