수색…


소개

ZipFile 클래스는 System.IO.Compression 네임 스페이스에 있습니다. 이 파일은 Zip 파일에서 읽고 Zip 파일에 쓸 수 있습니다.

비고

  • FileStream 대신 MemoryStream을 사용할 수도 있습니다.

  • 예외

예외 조건
ArgumentException 스트림이 이미 닫혀 있거나 스트림의 기능이 모드와 일치하지 않습니다 (예 : 읽기 전용 스트림에 쓰려고 시도).
ArgumentNullException 입력 스트림 이 null
ArgumentOutOfRangeException 모드의 값이 잘못되었습니다.
InvalidDataException 아래 목록 참조

InvalidDataException 가 슬로우되면 (자), 3 개의 원인이있을 가능성이 있습니다.

  • 스트림의 내용을 zip 아카이브로 해석 할 수 없습니다.
  • 모드 가 업데이트이고 항목이 아카이브에서 누락되었거나 손상되어 읽을 수 없습니다.
  • 모드 가 Update이고 항목이 너무 커서 메모리에 맞지 않습니다.

모든 정보는 이 MSDN 페이지 에서 가져온 것입니다 .

ZIP 내용 나열

이 스 니펫은 zip 아카이브의 모든 파일 이름을 나열합니다. 파일 이름은 zip 루트에 상대적입니다.

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    for (int i = 0; i < archive.Entries.Count; i++)
    {
        Console.WriteLine($"{i}: {archive.Entries[i]}");
    }
}

ZIP 파일에서 파일 압축 해제

모든 파일을 디렉토리로 추출하는 것은 매우 쉽습니다.

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}

파일이 이미 존재하면 System.IO.IOException 이 발생합니다.

특정 파일 압축 해제 :

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    // Get a root entry file
    archive.GetEntry("test.txt").ExtractToFile("test_extracted_getentries.txt", true);

    // Enter a path if you want to extract files from a subdirectory
    archive.GetEntry("sub/subtest.txt").ExtractToFile("test_sub.txt", true);

    // You can also use the Entries property to find files
    archive.Entries.FirstOrDefault(f => f.Name == "test.txt")?.ExtractToFile("test_extracted_linq.txt", true);

    // This will throw a System.ArgumentNullException because the file cannot be found
    archive.GetEntry("nonexistingfile.txt").ExtractToFile("fail.txt", true);
}

이러한 메소드 중 하나라도 동일한 결과를 생성합니다.

ZIP 파일 업데이트

ZIP 파일을 업데이트하려면 대신 ZipArchiveMode.Update로 파일을 열어야합니다.

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
{
    // Add file to root
    archive.CreateEntryFromFile("test.txt", "test.txt");

    // Add file to subfolder
    archive.CreateEntryFromFile("test.txt", "symbols/test.txt");
}

아카이브 내의 파일에 직접 쓰는 옵션도 있습니다 :

var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
    writer.WriteLine("Test line");
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow