ZIP (파일 형식)이란?
ZIP은 무손실 데이터 압축을 지원하는 아카이브 파일 형식입니다. ZIP 파일은 하나 이상의 파일 또는 디렉터리를 포함할 수 있으며, 이들은 압축될 수 있습니다. ZIP 파일은 일반적으로 .zip 또는 .ZIP 확장자를 사용하고 MIME 타입은 application/zip입니다. ZIP은 많은 프로그램에서 기본 파일 형식으로 사용되며, 보통 다른 이름으로 제공됩니다. 파일 시스템을 사용자 인터페이스를 통해 탐색할 때, ZIP 파일을 나타내는 그래픽 아이콘은 종종 지퍼가 강조된 문서나 다른 객체로 표시됩니다.
파일을 압축하는 파일을 압축하는 다양한 방법
은 사용 중인 운영 체제에 따라 다릅니다. 그리고 거의 매일 파일을 압축하거나 해제하고 이를 저장 서버나 파일 공유 플랫폼으로 전송해야 합니다. 다행히도 우리는 이 과정을 Aspose.ZIP API
를 사용해 자동화할 수 있습니다. 이 API는 기본 파일 구조에 신경 쓰지 않고 파일을 압축하고 해제할 수 있게 해줍니다. 이 문서에서는 단일 파일 및 다중 파일 압축 작업을 다룹니다.
Aspose.ZIP 패키지는 다음 NuGet 명령을 사용하여 .NET 프로젝트에 추가할 수 있습니다:
PM> Install-Package Aspose.Zip
C#로 단일 파일 압축하기
- 먼저 출력 ZIP 아카이브용 FileStream 클래스 객체를 생성해야 합니다.
- 단일 파일을 FileStream 객체에 로드합니다.
- Archive 클래스 객체를 생성합니다.
Archive.CreateEntry("FileName", FileStream) 메서드를 사용해 파일을 아카이브에 추가합니다.
Archive.Save(FileStream) 메서드로 ZIP 아카이브를 생성합니다.
using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
{
// 아카이브에 추가할 파일
using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive(new ArchiveEntrySettings()))
{
archive.CreateEntry("alice29.txt", source1);
archive.Save(zipFile);
}
}
}
C#로 다중 파일 압축하기
단일 파일 압축과 다중 파일 압축의 차이점은 더 많은 파일을 FileStream에 로드하고 Archive.CreateEntry("FileName", FileStream) 메서드를 사용해 모두 ZIP 아카이브에 추가해야 한다는 점입니다. 다음 코드 조각은 FileStream을 사용해 여러 파일을 ZIP에 추가하는 방법을 보여줍니다.
// 출력 ZIP 아카이브용 FileStream 생성
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// 아카이브에 추가할 파일
using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
{
// 아카이브에 추가할 파일
using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive())
{
// 파일을 아카이브에 추가
archive.CreateEntry("alice29.txt", source1);
archive.CreateEntry("asyoulik3.txt", source2);
// 파일 압축
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
}
}
}
}
FileInfo 클래스를 사용한 파일 압축
파일은 FileInfo 클래스를 사용하여 로드한 뒤 이전과 동일한 방식으로 ZIP 아카이브에 추가할 수 있습니다.
FileInfo 클래스는 파일의 생성, 복사, 삭제, 이동 및 열기를 위한 속성과 인스턴스 메서드를 제공하며, FileStream 객체 생성에도 도움을 줍니다.
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// 아카이브에 추가할 파일
FileInfo fi1 = new FileInfo("alice29.txt");
FileInfo fi2 = new FileInfo("fields.c");
using (var archive = new Archive())
{
// 파일을 아카이브에 추가
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("fields.c", fi2);
// ZIP 아카이브 생성
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
압축 없이 파일을 아카이브에 저장하기
// 압축 없이 ZIP 아카이브 생성
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
{
FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
{
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("lcet10.txt", fi2);
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
C#에서 비밀번호로 ZIP 파일 만들기
using (var archive = new Archive(new ArchiveEntrySettings(encryptionSettings: new TraditionalEncryptionSettings("pass"))))
{
archive.CreateEntry("entry_name1.dat", "input_file1.dat");
archive.CreateEntry("entry_name2.dat", "input_file2.dat");
archive.Save("result_archive.zip");
}
encryptionSettings 매개변수는 비밀번호가 보호된 ZIP 아카이브를 생성하는 데 사용됩니다.
C#에서 비밀번호로 ZIP 파일 해제하기
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
ArchiveLoadOptions의 DecryptionPassword 속성 값을 사용하여 비밀번호가 보호된 ZIP 아카이브를 엽니다.
전체 예제와 데이터 파일은 https://github.com/aspose-zip/Aspose.ZIP-for-.NET
에서 확인할 수 있습니다.
ZIP 아카이브 내에서 LZMA 압축 사용하기
Lempel–Ziv–Markov chain 알고리즘(LZMA)은 무손실 데이터 압축을 수행하는 알고리즘입니다. LZMA는 사전 기반 압축 방식을 사용하며, 압축된 스트림은 비트 스트림 형태입니다. ZIP 아카이브 내에서 LZMA 압축을 사용하면 ZIP 컨테이너에 LZMA 압축 항목을 포함할 수 있습니다. 다음 코드 예제는 Aspose.ZIP API
를 사용해 LZMA 압축을 구현하는 방법을 보여줍니다.
using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
ZIP 아카이브 내에서 BZip2 압축 사용하기
bzip2는 Burrows–Wheeler 알고리즘을 사용하는 무료 오픈소스 파일 압축 프로그램입니다. 단일 파일만 압축하며 파일 아카이버는 아닙니다. Julian Seward가 개발했으며, Mark Wielaard와 Micah Snyder가 유지 관리합니다. 다음 코드 조각은 Aspose.ZIP API
를 사용해 BZip2 압축을 구현하는 방법을 보여줍니다.
using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
ZIP 아카이브 내에서 PPMd 압축 사용하기
Partial Matching에 의한 예측(PPM)은 컨텍스트 모델링과 예측에 기반한 적응형 통계 데이터 압축 기법입니다. PPM 모델은 압축되지 않은 심볼 스트림의 이전 심볼 집합을 사용해 다음 심볼을 예측합니다. PPM 알고리즘은 클러스터 분석에서 데이터 그룹을 예측하는 데에도 활용될 수 있습니다. 다음 코드 조각은 Aspose.ZIP API
를 사용해 PPMd 압축을 구현하는 방법을 보여줍니다.
using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
단일 파일로 아카이브 압축 해제
using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
{
using (Archive archive = new Archive(fs))
{
int percentReady = 0;
archive.Entries[0].ExtractionProgressed += (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% decompressed", percent));
percentReady = percent;
}
};
archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
}
}
다중 파일로 아카이브 압축 해제
using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
{
StringBuilder sb = new StringBuilder("Entries are: ");
int percentReady = 0;
using (Archive archive = new Archive(zipFile,
new ArchiveLoadOptions()
{
EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
EntryExtractionProgressed = (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
}
}
}))
{
Console.WriteLine(sb.ToString(0, sb.Length - 2));
using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// 압축 해제된 스트림을 파일에 기록합니다.
}
}
percentReady = 0;
archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
}
}
압축되지 않은 저장 아카이브 추출
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
{
using (Archive archive = new Archive(zipFile))
{
using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// 압축 해제된 스트림을 파일에 기록합니다.
}
}
using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[1].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// 압축 해제된 스트림을 파일에 기록합니다.
}
}
}
}
전체 예제와 데이터 파일은 https://github.com/aspose-zip/Aspose.ZIP-for-.NET
에서 확인할 수 있습니다.