압축 진행 상황 보고
Contents
[
Hide
Show
]진행 이벤트 핸들러
특히 데이터 크기가 큰 경우 압축 프로세스에 오랜 시간이 걸릴 수 있습니다. zip 아카이브의 경우 계속 게시되는 CompressionProgressed 이벤트가 있습니다. 이 이벤트는 지금까지 진행된 바이트 수를 포함하는 ProgressEventArgs에 의존합니다. 다음은 람다 확장을 사용하여 이 이벤트를 구독할 수 있는 방법입니다.
1 Entry.CompressionProgressed += (s, e) => {
2 Console.WriteLine(string.Format("{0}바이트 압축됨", e.ProceededBytes));
3 };
Zip 진행률 보고
‘CompressionProgressed’ 이벤트가 발생할 때마다 ‘ProceededBytes’ 숫자를 원본 파일의 길이로 나눕니다. 이를 통해 현재 압축된 바이트의 비율을 알 수 있습니다. 다음은 전체 샘플입니다.
- File.Open을 사용하여 읽기 모드에서 huge.bin 파일을 열어 압축을 준비합니다.
- 압축을 위한 PPMdCompressionSettings를 지정하여 Archive 클래스의 새 인스턴스를 초기화합니다.
- CreateEntry 메소드를 사용하여 huge.bin 파일에 대한 아카이브 항목을 생성하고 이를 소스 파일 스트림에 연결합니다.
- CompressionProgressed 이벤트에 이벤트 핸들러를 연결하여 압축 진행 상황을 모니터링합니다. 지금까지 압축된 파일의 비율을 계산합니다.
- 이벤트 핸들러 내에서 압축 비율을 업데이트하고 진행률이 높아질 때마다 콘솔에 표시합니다.
- 압축이 완료되면 지정된 zipFile에 아카이브를 저장합니다.
1 (FileStream 소스 = File.Open("huge.bin", FileMode.Open, FileAccess.Read)) 사용
2 {
3 (var archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings()))) 사용
4 {
5 ArchiveEntry 항목 = archive.CreateEntry("huge.bin", source);
6 int 퍼센트 준비 = 0;
7 Entry.CompressionProgressed += (s, e) =>
8 {
9 int 퍼센트 = (int)((100 * (long)e.ProceededBytes) / source.Length);
10 if (퍼센트 > 퍼센트준비)
11 {
12 Console.WriteLine(string.Format("{0}% 압축됨", 백분율));
13 퍼센트준비 = 퍼센트;
14 }
15 };
16 archive.Save(zip파일);
17 }
18 }
7z 진행률 보고
7z 아카이브에도 비슷한 접근 방식이 있습니다. 해당 항목에는 자체 CompressionProgressed 이벤트가 있습니다.
단계: C#의 7z 아카이브에서 LZMA2를 사용하여 압축 진행 상황 모니터링</ 아>
- 소스 파일(huge.bin)을 읽기 모드로 엽니다.
- LZMA2 압축 설정을 사용하여 SevenZipArchive 개체를 만듭니다.
- CreateEntry 메소드를 사용하여 소스 파일을 아카이브에 항목으로 추가합니다.
- CompressionProgressed 이벤트를 구독하여 압축 진행률을 추적하고 계산합니다.
- 모든 진행 상황 업데이트에 대해 완료된 압축 비율을 계산합니다.
- 아카이브를 지정된 대상(zipFile)에 저장합니다.
1(FileStream 소스 = File.Open("huge.bin", FileMode.Open, FileAccess.Read)) 사용
2 {
3 (var archive = new SevenZipArchive(new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings()))) 사용
4 {
5 SevenZipArchiveEntry 항목 = archive.CreateEntry("huge.bin", source);
6 int 퍼센트 준비 = 0;
7 Entry.CompressionProgressed += 대리자(객체, ProgressEventArgs e)
8 {
9 // s는 SevenZipArchiveEntry입니다.
10 int 퍼센트 = (int)((100 * (long)e.ProceededBytes) / source.Length);
11 if (퍼센트 > 퍼센트준비)
12 {
13 퍼센트준비 = 퍼센트;
14 }
15 };
16 archive.Save(zip파일);
17 }
18 }