??????? ZIP-????? ???????
?????? ?????? zip-?????? ????? ???? ?????? zip-??????. ????????, ??? ????????? ??????? ?????????? ?????????? zip-?????? ? ???????????? ?????, ????? ???????? ??????? ?????????.
??????? ????????? ??????
outer.zip +first.txt +inner.zip � +game.exe � +subitem.bin +picture.gif
???????? ????????? ??????
flatten.zip +first.txt +picture.gif +game.exe +subitem.bin
???? ?? ?? ??????? ? Aspose.Zip, ??????? ????????, ??? ??????????? zip-?????.
????? ??????????
??? ?????? ??? ????? ??????????? ??? ?????? ??????. ??????? ?????? ??????? ????????? ??????, ????? ??? ????, ??? ???? ?? ??????? ?? ?????????????. ??????, ??????? ???? ?? ???? ???????? ????????, ?????????? ??????? ? ?????? ? ??????? ?? ???????? ??????. ?? ?????????? ?????????? ???????? ? ???????? ?????.
??????????? ???????, ?????????? ????????
??????? ?????, ????? ?????? ???? ???????? ????????. ?? ????? ?????? ???, ???????? ??? ??????. ????? ?? ?????? ??? ?????? ?? ????????? ??????, ??????? ??????? ????? ?????? ? ??????.
1if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) {
2 entriesToDelete.Add(entry);
3 ...
4}?????????? ??????????? ?????? ? ??????
Aspose.Zip ????????? ????????? ?????????? zip-????? ? ????? ???????????? ?????, ? ?? ?????? ? ????. ????, ?? ????? ??????? ????????? ????? ? ????? ??????.
???????? ????????: ??????????? ?????? ?????? ???? ?????????? ???????, ????? ??????? ???? ??????????? ???????.
1MemoryStream innerCompressed = new MemoryStream();
2entry.Open().CopyTo(innerCompressed); ????? ????? ????? InternalCompressed ???????? ??? ?????????? ?????. ??????????? ?????? ????????? ??????????? ??????????????? ?????. ????, ?? ????? ????? ??????? ???:
1Archive inner = new Archive(innerCompressed);???????? ??????
?? ????? ??????? ?????? ?? zip-?????? ? ??????? ????????????? ??????.
1foreach (ArchiveEntry e in entriesToDelete) { outer.DeleteEntry(e); }????????? ??? ???
??? ?????? ????????.
1 using (Archive outer = new Archive("outer.zip"))
2 {
3 List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
4 List<string> namesToInsert = new List<string>();
5 List<MemoryStream> contentToInsert = new List<MemoryStream>();
6
7 foreach (ArchiveEntry entry in outer.Entries)
8 {
9 if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) // Find an entry which is an archive itself
10 {
11 entriesToDelete.Add(entry); // Keep reference to the entry in order to remove it from the archive later
12 MemoryStream innerCompressed = new MemoryStream();
13 entry.Open().CopyTo(innerCompressed); //This extracts the entry to a memory stream
14
15 using (Archive inner = new Archive(innerCompressed)) // We know that content of the entry is an zip archive so we may extract
16 {
17 foreach (ArchiveEntry ie in inner.Entries) // Loop over entries of inner archive
18 {
19 namesToInsert.Add(ie.Name); // Keep the name of inner entry.
20 MemoryStream content = new MemoryStream();
21 ie.Open().CopyTo(content);
22 contentToInsert.Add(content); // Keep the content of inner entry.
23 }
24 }
25 }
26 }
27
28 foreach (ArchiveEntry e in entriesToDelete)
29 outer.DeleteEntry(e); // Delete all the entries which are archives itself
30
31 for (int i = 0; i < namesToInsert.Count; i++)
32 outer.CreateEntry(namesToInsert[i], contentToInsert[i]); // Adds entries which were entries of inner archives
33
34 outer.Save("flatten.zip");
35 }