
종종 아카이브의 중첩 구조를 형성하는 다른 ZIP 아카이브를 내부에 포함하는 ZIP 아카이브를 얻습니다. 이러한 경우 모든 내부 ZIP 아카이브를 외부 아카이브로 추출하여 평면 구조를 원할 수 있습니다. 이 작업을 프로그래밍 방식으로 수행하기 위해 이 문서에서는 C#에서 플랫 ZIP 아카이브를 만드는 방법을 보여줍니다.
플랫 ZIP 아카이브를 만드는 C# .NET API
플랫 ZIP 아카이브를 생성하기 위해 Aspose.ZIP for .NET을 사용합니다. ZIP, TAR, GZip, 7z 등 널리 사용되는 아카이브 형식을 만들고 추출하도록 설계된 아카이브 API입니다. NuGet에서 API를 설치하거나 다운로드 섹션에서 해당 DLL을 다운로드할 수 있습니다.
PM> Install-Package Aspose.Zip
C#에서 플랫 ZIP 아카이브 만들기
플랫 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
이 변환을 프로그래밍 방식으로 수행하는 방법을 살펴보겠습니다. 다음은 C#에서 플랫 ZIP 아카이브를 만드는 단계입니다.
- 먼저 Archive 클래스를 사용하여 상위 ZIP 아카이브를 로드합니다.
- 그런 다음 상위 ZIP에서 삭제할 내부 ZIP 항목, 추출된 항목 및 해당 이름을 저장할 목록을 만듭니다.
- 그런 다음 Archive.Entries 컬렉션을 사용하여 상위 ZIP의 각 ArchiveEntry를 반복합니다.
- 각 항목에 대해 다음 작업을 수행합니다.
- ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 메서드를 사용하여 항목이 ZIP 아카이브인지 확인합니다.
- 그런 다음 삭제할 항목 목록에 항목을 추가합니다.
- ArchiveEntry.Open().CopyTo(MemoryStream) 메서드를 사용하여 MemoryStream 개체에 대한 항목을 엽니다.
- 내부 ZIP 아카이브 항목을 반복하고 각 반복에서 다음 단계를 수행합니다.
- 추가할 항목 목록에 항목 이름을 추가합니다.
- 그런 다음 ArchiveEntry.Open().CopyTo(MemoryStream) 메서드를 사용하여 MemoryStream에 항목을 로드합니다.
- 마지막으로 상위 ZIP에 추가할 항목 목록에 항목을 추가합니다.
- 그런 다음 내부 ZIP 아카이브 목록을 반복하고 Archive.DeleteEntry(ArchiveEntry) 메서드를 사용하여 각 항목을 삭제합니다.
- 상위 ZIP에 추가할 항목 목록을 반복하고 Archive.CreateEntry(String, Stream) 메서드를 사용하여 각 항목을 추가합니다.
- 마지막으로 Archive.Save(String) 메서드를 사용하여 상위 ZIP 아카이브를 저장합니다.
다음 코드 샘플은 C#에서 플랫 ZIP 아카이브를 만드는 방법을 보여줍니다.
// 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 라이선스 받기
평가 제한 없이 Aspose.ZIP for .NET을 사용할 수 있는 무료 임시 라이선스를 얻을 수 있습니다.
결론
이 기사에서는 C#에서 프로그래밍 방식으로 플랫 ZIP 아카이브를 만드는 방법을 배웠습니다. 특히, 내부 ZIP 아카이브를 상위 ZIP으로 추출하여 플랫 ZIP을 만드는 방법을 시연했습니다. 그 외에도 문서를 방문하여 .NET용 Aspose.ZIP에 대해 자세히 알아볼 수 있습니다. 또한 포럼을 통해 질문을 공유할 수 있습니다.