종종 아카이브의 중첩 구조를 형성하는 다른 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에 대해 자세히 알아볼 수 있습니다. 또한 포럼을 통해 질문을 공유할 수 있습니다.

또한보십시오