최근 압축 및 압축해제를 구현해야해서 라이브러리를 찾아보던 중
IONIC.ZIP 라이브러리를 사용하게 되었습니다.
설치는 비주얼스튜디오 NuGet에서 Ionic으로 검색하면 설치할 수 있습니다.
예제는 선택한 폴더를 압축/압축해제 하는 예제 코드 입니다.
1. 압축
private void zipFolder()
{
string sSourcePath = tbLoadFolderPath.Text;
string sTargetPath = tbSavePath.Text;
try
{
using (ZipFile zip = new ZipFile())
{
DirectoryInfo di = new DirectoryInfo(sSourcePath);
//프로그레스바 최대 값 (디렉토리내 모든 파일 수)
mMaximum += di.GetFiles("*.*", System.IO.SearchOption.AllDirectories).Count();
//프로그레스바 이벤트 설정
zip.SaveProgress += Zip_SaveProgress;
FileInfo[] infos = di.GetFiles("*.*", SearchOption.AllDirectories);
string[] files = new string[infos.Length];
for (int i = 0; i < infos.Length; i++)
{
files[i] = infos[i].FullName;
}
byte[] b = null;
string fileName = string.Empty;
foreach (string file in files)
{
fileName = file.Replace(sSourcePath, "");
//기본 인코딩 타입으로 읽기
b = Encoding.Default.GetBytes(fileName);
// IBM437로 변환
fileName = Encoding.GetEncoding("IBM437").GetString(b);
zip.AddEntry(fileName, File.ReadAllBytes(file));
}
DirectoryInfo dir = new DirectoryInfo(sTargetPath);
if(!dir.Exists)
{
dir.Create();
}
string[] split = sSourcePath.Split('\\');
string sZipName = split[split.Length - 1];
zip.Save($"{sTargetPath}\\{sZipName}.zip");
}
Process.Start(sTargetPath);
}
catch(Exception ex)
{
MessageBox.Show($"{ex.Message}\r\n압축 실패");
return;
}
}
2. 압축 해제
private void unZipFile()
{
string sSourcePath = tbLoadZipPath.Text;
string sTargetPath = tbSavePath.Text;
try
{
using (ZipFile zip = ZipFile.Read(sSourcePath))
{
FileInfo fi = new FileInfo(sSourcePath);
zip.ExtractProgress += Extract_Progress;
//프로그레스바 맥시멈 값
mMaximum = zip.Entries.Count;
DirectoryInfo dir = new DirectoryInfo(sTargetPath);
if (!dir.Exists)
{
dir.Create();
}
string saveFolderPath = $"{sTargetPath}\\{Path.GetFileNameWithoutExtension(sSourcePath)}";
for (int i = 0; i < zip.Entries.Count; i++)
{
ZipEntry entry = zip[i];
//IBM437 인코딩
byte[] byteIbm437 = Encoding.GetEncoding("IBM437").GetBytes(zip[i].FileName);
//euckr 인코딩
string euckrFileName = Encoding.GetEncoding("euc-kr").GetString(byteIbm437);
zip[i].FileName = euckrFileName;
entry.Extract(saveFolderPath, ExtractExistingFileAction.OverwriteSilently);
}
Process.Start(saveFolderPath);
}
}
catch (Exception ex)
{
MessageBox.Show($"{ex.Message}\r\n압축 해제 실패");
return;
}
}
3. 예제 소스 코드 파일
프로그레스바를 ionic.zip에서 지원하는 이벤트로만 구현했는데
개인적으로 사용하실때에는 조금 손보는게 좋을 것 같습니다.
예제 코드는 이전에 구글링한 자료에 집에서 생각나는것만 정리한 정도이니 참고만 하시면 될 것 같습니다
'C#' 카테고리의 다른 글
C# 파일 확장자 타입 체크 시 실수 (0) | 2024.05.14 |
---|---|
C# Winform 반짝이는 버튼 컨트롤 만들기 (0) | 2021.12.19 |
c# Devexpress gridcontrol 특정 셀 버튼 표시 방법 (0) | 2021.12.19 |
C# 폴더 파일 구분 (0) | 2021.04.13 |
c# 숨김 폴더(디렉토리) 체크 방법 (0) | 2021.04.13 |