.NET에서 파일 압축 또는 압축 풀기
개요
이 문서에서는 C#이나 .NET API 및 샘플 코드를 활용하는 다양한 방법을 사용하여 프로그래밍 방식으로 Zip 파일을 압축하는 방법을 설명합니다. 하나 이상의 파일을 압축하거나 압축하는 방법과 파일을 동시에 압축하는 방법을 배우게 됩니다. 또한 파일의 압축을 풀거나 압축을 푸는 방법도 배우게 됩니다.
C#에서 파일을 Zip 또는 압축하고 C#에서 파일의 압축을 풀거나 압축 해제
Aspose.ZIP API를 사용하면 기본 파일 구조에 대해 걱정하지 않고 파일을 압축하고 압축을 풀 수 있습니다. 이 문서에서는 단일 및 다중 파일 압축 작업을 보여줍니다.
파일 압축
단일 파일 압축
- 원하는 출력 zip 파일 이름으로 파일 스트림을 생성합니다.
- 압축할 데이터 파일의 파일 스트림을 생성합니다.
- Archive 클래스의 인스턴스를 생성하고 ArchiveEntrySettings 클래스의 인스턴스를 전달합니다.
- Archive.CreateEntry 메서드를 사용하여 2단계에서 생성한 데이터 파일을 추가합니다.
- Archive.Save 메서드를 사용하여 데이터 파일을 압축하고 1단계에서 생성한 파일 스트림을 전달합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
3 {
4 //File to be added to archive
5 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
6 {
7 using (var archive = new Archive(new ArchiveEntrySettings()))
8 {
9 archive.CreateEntry("alice29.txt", source1);
10
11 archive.Save(zipFile);
12 }
13 }
14 }
여러 파일 압축
- 원하는 출력 zip 파일 이름으로 파일 스트림을 생성합니다.
- 압축할 첫 번째 데이터 파일의 파일 스트림을 생성합니다.
- 압축할 두 번째 데이터 파일의 파일 스트림을 생성합니다.
- Archive 클래스의 인스턴스를 생성합니다.
- Archive.CreateEntry 메서드를 사용하여 2단계와 3단계에서 생성한 데이터 파일을 추가합니다.
- ArchiveSaveOptions 클래스의 인스턴스를 생성합니다.
- Archive.Save 메서드를 사용하여 데이터 파일을 압축하고 1단계에서 생성된 파일 스트림과 위 단계에서 생성된 ArchiveSaveOptions 인스턴스를 전달합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "There are two poems from Canterbury corpus" });
13 }
14 }
15 }
16 }
17
파일 정보로 파일 압축
- 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다.
- 압축할 첫 번째 데이터 파일의 FileInfo 개체를 만듭니다.
- 압축할 두 번째 데이터 파일의 FileInfo 개체를 생성합니다.
- Archive 클래스의 인스턴스를 생성합니다.
- Archive.CreateEntry 메서드를 사용하여 2단계와 3단계에서 생성한 데이터 파일을 추가합니다.
- ArchiveSaveOptions 클래스의 인스턴스를 생성합니다.
- Archive.Save 메서드를 사용하여 데이터 파일을 압축하고 1단계에서 생성된 파일 스트림과 위 단계에서 생성된 ArchiveSaveOptions 인스턴스를 전달합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressFilesByFileInfo_out.zip", FileMode.Create))
3 {
4 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
5 FileInfo fi2 = new FileInfo(dataDir + "fields.c");
6
7 using (var archive = new Archive())
8 {
9 archive.CreateEntry("alice29.txt", fi1);
10 archive.CreateEntry("fields.c", fi2);
11 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
12 }
13 }
14
압축하지 않고 아카이브에 파일 저장
단계: 저장 C#을 사용하여 압축하지 않고 보관할 파일1. 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다. 2. 아카이브에 저장할 데이터 파일에 대한 FileInfo 개체를 만듭니다. 3. ArchiveEntrySettings 클래스의 인스턴스를 생성하고 StoreCompressionSettings 클래스의 인스턴스를 전달합니다. 4. Archive 클래스의 인스턴스를 생성하고 위 단계에서 생성된 ArchiveEntrySettings 클래스의 인스턴스를 전달합니다. 5. Archive.CreateEntry 메서드를 사용하여 2단계에서 생성된 FileInfo 개체를 추가합니다. 6. ArchiveSaveOptions의 인스턴스를 생성하고 Encoding = Encoding.ASCII를 설정합니다. 7. Archive.Save 메서드를 사용하여 데이터 파일을 압축하고 1단계에서 생성된 파일 스트림과 위 단계에서 생성된 ArchiveSaveOptions 인스턴스를 전달합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 //Creates zip archive without compressing files
3 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
4 {
5 FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
6 FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
7
8 using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
9 {
10 archive.CreateEntry("alice29.txt", fi1);
11 archive.CreateEntry("lcet10.txt", fi2);
12 archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
13 }
14
15 }
16
병렬성을 사용하여 파일 압축
- 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다.
- 압축할 첫 번째 및 두 번째 데이터 파일에 대해 FileMode.Open 및 FileAccess.Read를 사용하여 파일 스트림을 엽니다.
- Archive 클래스의 인스턴스를 생성합니다.
- Archive.CreateEntry 메서드를 사용하여 2단계에서 생성한 데이터 파일을 추가합니다.
- ParallelOptions의 인스턴스를 생성하고 ParallelCompressInMemory = ParallelCompressionMode.Always를 설정합니다.
- ArchiveSaveOptions의 인스턴스를 생성하고 위의 인스턴스로 ParallelOptions 속성을 설정합니다.
- Archive.Save 메서드를 사용하여 데이터 파일을 압축하고 1단계에서 생성된 파일 스트림과 위 단계에서 생성된 ArchiveSaveOptions 인스턴스를 전달합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
3 {
4 using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
5 {
6 using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
7 {
8 using (var archive = new Archive())
9 {
10 archive.CreateEntry("alice29.txt", source1);
11 archive.CreateEntry("asyoulik.txt", source2);
12 //Define the parallelism criterion
13 var parallelOptions = new ParallelOptions
14 {
15 ParallelCompressInMemory = ParallelCompressionMode.Always
16 };
17 archive.Save(zipFile,
18 new ArchiveSaveOptions()
19 {
20 ParallelOptions = parallelOptions,
21 Encoding = Encoding.ASCII,
22 ArchiveComment = "There are two poems from Canterbury corpus"
23 });
24 }
25 }
26 }
27 }
28
ZIP 아카이브 내의 LZMA 압축
Lempel–Ziv–Markov 체인 알고리즘(LZMA)은 무손실 데이터 압축을 수행하는 데 사용되는 알고리즘입니다. LZMA는 사전 압축 알고리즘을 사용하며 압축된 스트림은 비트 스트림입니다. ZIP 아카이브 내의 LZMA 압축을 사용하면 ZIP 컨테이너에 LZMA 압축 항목이 포함될 수 있습니다. 다음 코드 예제에서는 Aspose.ZIP API를 사용하여 LZMA 압축을 구현하는 방법을 보여줍니다.
- 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다.
- ArchiveEntrySettings의 인스턴스를 생성하고 이를 LzmaCompressionSettings 클래스의 인스턴스에 전달합니다.
- Archive 클래스의 인스턴스를 생성하고 위에서 생성한 ArchiveEntrySettings 인스턴스를 전달합니다.
- Archive.CreateEntry 메서드를 사용하여 파일 경로를 통해 압축할 데이터 파일을 추가합니다.
- Archive.Save 방법을 사용하여 데이터 파일을 압축합니다.
1 using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
ZIP 아카이브 내의 BZip2 압축
BZip2 압축 설정을 사용하면 ZIP 컨테이너에 BZip2 압축 항목이 포함될 수 있습니다. 다음 코드 예제에서는 Aspose.ZIP API를 사용하여 BZip2 압축을 구현하는 방법을 보여줍니다.
단계: ZIP 아카이브 내에서 BZip2 압축 C# 사용
- 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다.
- ArchiveEntrySettings의 인스턴스를 생성하고 이를 Bzip2CompressionSettings 클래스의 인스턴스에 전달합니다.
- Archive 클래스의 인스턴스를 생성하고 위에서 생성한 ArchiveEntrySettings 인스턴스를 전달합니다.
- Archive.CreateEntry 메서드를 사용하여 파일 경로를 통해 압축할 데이터 파일을 추가합니다.
- Archive.Save 방법을 사용하여 데이터 파일을 압축합니다.
1 using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
ZIP 아카이브 내의 PPMd 압축
PPMd 압축 설정을 사용하면 ZIP 컨테이너에 PPMd 압축 항목이 포함될 수 있습니다. 다음 코드 예제에서는 Aspose.ZIP API를 사용하여 PPMd 압축을 구현하는 방법을 보여줍니다.
- 출력 zip 파일의 원하는 이름을 사용하여 FileMode.Create를 사용하여 파일 스트림을 엽니다.
- ArchiveEntrySettings의 인스턴스를 생성하고 이를 PPMdCompressionSettings 클래스의 인스턴스에 전달합니다.
- Archive 클래스의 인스턴스를 생성하고 위에서 생성한 ArchiveEntrySettings 인스턴스를 전달합니다.
- Archive.CreateEntry 메서드를 사용하여 파일 경로를 통해 압축할 데이터 파일을 추가합니다.
- Archive.Save 방법을 사용하여 데이터 파일을 압축합니다.
1 using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
4 {
5 archive.CreateEntry("sample.txt", dataDir + "sample.txt");
6 archive.Save(zipFile);
7 }
8 }
9
아카이브 압축 풀기
단일 파일이 있는 아카이브 압축 풀기
단계: C#을 사용하여 아카이브에서 단일 파일 압축 풀기
- FileMode.OpenRead를 사용하여 입력 ZIP 파일에 대한 파일 스트림을 엽니다.
- 파일 스트림을 생성자에 전달하여 Archive 클래스의 인스턴스를 만듭니다.
- 아카이브 항목의 ExtractionProgressed 이벤트를 사용하여 압축 해제 진행 상황을 모니터링합니다.
- Extract 메서드를 사용하고 출력 파일 경로를 지정하여 아카이브에서 단일 파일을 추출합니다.
- 콘솔에 압축 해제 진행률을 백분율로 표시합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
3 {
4 using (Archive archive = new Archive(fs))
5 {
6 int percentReady = 0;
7 archive.Entries[0].ExtractionProgressed += (s, e) =>
8 {
9 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
10 if (percent > percentReady)
11 {
12 Console.WriteLine(string.Format("{0}% decompressed", percent));
13 percentReady = percent;
14 }
15 };
16 archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
17 }
18 }
19
여러 파일이 있는 아카이브 압축 풀기
단계: C#을 사용하여 아카이브에서 여러 파일의 압축 풀기< /strong>
- FileMode.Open을 사용하여 입력 ZIP 파일에 대한 파일 스트림을 엽니다.
- 사용자 정의 로드 옵션을 사용하여 Archive 클래스의 인스턴스를 생성하여 항목을 나열하고 압축 해제 진행 상황을 추적합니다.
- EntryListed 이벤트를 사용하여 모든 아카이브 항목의 이름을 표시합니다.
- EntryExtractionProgressed 이벤트를 통해 압축 해제 진행 상황을 모니터링하고 콘솔에 진행 상황을 표시합니다.
- Extract 메서드를 사용하고 데이터를 출력 파일로 읽어 아카이브에서 여러 파일을 추출합니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
3 {
4 StringBuilder sb = new StringBuilder("Entries are: ");
5 int percentReady = 0;
6 using (Archive archive = new Archive(zipFile,
7 new ArchiveLoadOptions()
8 {
9 EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
10 EntryExtractionProgressed = (s, e) =>
11 {
12 int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
13 if (percent > percentReady)
14 {
15 Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
16 }
17 }
18 }))
19 {
20 Console.WriteLine(sb.ToString(0, sb.Length - 2));
21 using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
22 {
23 using (var decompressed = archive.Entries[0].Open())
24 {
25 byte[] buffer = new byte[8192];
26 int bytesRead;
27 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
28 {
29 extracted.Write(buffer, 0, bytesRead);
30 }
31 // Read from decompressed stream to extracting file.
32 }
33 }
34 percentReady = 0;
35 archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
36 }
37 }
38
압축하지 않고 저장된 아카이브 추출
단계: 아카이브에서 파일을 추출하고 디스크에 저장 C# 사용
- ZIP 파일을 열고 Archive 클래스의 인스턴스를 생성합니다.
- 항목의 스트림을 열고 해당 내용을 새 파일에 기록하여 아카이브에서 첫 번째 파일을 추출합니다.
- 버퍼를 사용하여 압축이 풀린 스트림에서 데이터를 읽고 이를 출력 파일에 저장합니다.
- 아카이브의 두 번째 파일에 대해 프로세스를 반복하여 해당 내용을 별도의 출력 파일에 씁니다.
1 // For complete examples and data files, please go to https://github.com/aspose-zip/Aspose.ZIP-for-.NET
2 using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
3 {
4 using (Archive archive = new Archive(zipFile))
5 {
6 using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
7 {
8 using (var decompressed = archive.Entries[0].Open())
9 {
10 byte[] buffer = new byte[8192];
11 int bytesRead;
12 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
13 {
14 extracted.Write(buffer, 0, bytesRead);
15 }
16 // Read from decompressed stream to extracting file.
17 }
18 }
19
20 using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
21 {
22 using (var decompressed = archive.Entries[1].Open())
23 {
24 byte[] buffer = new byte[8192];
25 int bytesRead;
26 while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
27 {
28 extracted.Write(buffer, 0, bytesRead);
29 }
30 // Read from decompressed stream to extracting file.
31 }
32 }
33 }
34 }
35