안녕하세요~ 작은나무 입니다.
특정 폴더를 압축하고 해제하는 방법에 대해 알아보겠습니다.
압축
ZipFileUtil.ZipFiles("경로", "test.zip", "", false);
해제
ZipFileUtil.UnZipFiles("test.zip", "경로", "", false);
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
public class ZipFileUtil
{
//특정 폴더를 ZIP으로 압축
public static bool ZipFiles(string targetFolderPath, string zipFilePath, string password, bool isDeleteFolder)
{
bool retVal = false;
// 폴더가 존재하는 경우에만 수행.
if (Directory.Exists(targetFolderPath))
{
ArrayList ar = GenerateFileList(targetFolderPath); // 압축 대상 폴더의 파일 목록.
// 압축 대상 폴더 경로의 길이 + 1
int TrimLength = (Directory.GetParent(targetFolderPath)).ToString().Length + 1; // find number of chars to remove. from orginal file path. remove '\'
FileStream ostream;
byte[] obuffer;
string outPath = zipFilePath;
ZipOutputStream oZipStream = new ZipOutputStream(File.Create(outPath)); // ZIP 스트림 생성.
try
{
// 패스워드가 있는 경우 패스워드 지정.
if (password != null && password != String.Empty)
oZipStream.Password = password;
oZipStream.SetLevel(9); // 암호화 레벨.(최대 압축)
ZipEntry oZipEntry;
foreach (string Fil in ar)
{
oZipEntry = new ZipEntry(Fil.Remove(0, TrimLength));
oZipStream.PutNextEntry(oZipEntry);
// 파일인 경우.
if (!Fil.EndsWith(@"/"))
{
ostream = File.OpenRead(Fil);
obuffer = new byte[ostream.Length];
ostream.Read(obuffer, 0, obuffer.Length);
oZipStream.Write(obuffer, 0, obuffer.Length);
}
}
retVal = true;
}
catch
{
retVal = false;
// 오류가 난 경우 생성 했던 파일을 삭제.
if (File.Exists(outPath))
File.Delete(outPath);
}
finally
{
// 압축 종료.
oZipStream.Finish();
oZipStream.Close();
}
// 폴더 삭제를 원할 경우 폴더 삭제.
if (isDeleteFolder)
{
try
{
Directory.Delete(targetFolderPath, true);
}
catch { }
}
return retVal;
}
//파일, 폴더 목록 생성
private static ArrayList GenerateFileList(string Dir)
{
ArrayList fils = new ArrayList();
bool Empty = true;
// 폴더 내의 파일 추가.
foreach (string file in Directory.GetFiles(Dir))
{
fils.Add(file);
Empty = false;
}
if (Empty)
{
// 파일이 없고, 폴더도 없는 경우 자신의 폴더 추가.
if (Directory.GetDirectories(Dir).Length == 0)
fils.Add(Dir + @"/");
}
// 폴더 내 폴더 목록.
foreach (string dirs in Directory.GetDirectories(Dir))
{
// 해당 폴더로 다시 GenerateFileList 재귀 호출
foreach (object obj in GenerateFileList(dirs))
{
// 해당 폴더 내의 파일, 폴더 추가.
fils.Add(obj);
}
}
return fils;
}
//압축 파일 풀기
public static bool UnZipFiles(string zipFilePath, string unZipTargetFolderPath, string password, bool isDeleteZipFile)
{
bool retVal = false;
// ZIP 파일이 있는 경우만 수행.
if(File.Exists(zipFilePath))
{
// ZIP 스트림 생성.
ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(zipFilePath));
// 패스워드가 있는 경우 패스워드 지정.
if (password != null && password != String.Empty)
zipInputStream.Password = password;
try {
ZipEntry theEntry;
// 반복하며 파일을 가져옴.
while ((theEntry = zipInputStream.GetNextEntry()) != null) {
string directoryName = Path.GetDirectoryName(theEntry.Name); // 폴더
string fileName = Path.GetFileName(theEntry.Name); // 파일
// 폴더 생성
Directory.CreateDirectory(unZipTargetFolderPath + directoryName);
// 파일 이름이 있는 경우
if (fileName != String.Empty)
{
// 파일 스트림 생성.(파일생성)
FileStream streamWriter = File.Create((unZipTargetFolderPath + theEntry.Name));
int size = 2048;
byte[] data = new byte[2048];
// 파일 복사
while (true) {
size = zipInputStream.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
// 파일스트림 종료
streamWriter.Close();
}
}
retVal = true;
}
catch { retVal = false; }
finally { // ZIP 파일 스트림 종료 zipInputStream.Close(); }
// ZIP파일 삭제를 원할 경우 파일 삭제.
if (isDeleteZipFile)
try { File.Delete(zipFilePath); } catch { }
}
return retVal;
}