본문 바로가기
C#

Zip 압축

by 캡틴노랑이 2015. 8. 21.
반응형
특정 폴더의 파일을 압축하는 프로그램 예제.



using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using ICSharpCode.SharpZipLib.Zip;
 

namespace AutoZipTimer
{
    public class ZipManager
    {
        /// 
        /// 특정 폴더를 ZIP으로 압축
        /// 
        /// 압축 대상 폴더 경로
        /// 저장할 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;
        }
        /// 
        /// 파일, 폴더 목록 생성
        /// 
        /// 폴더 경로
        /// 폴더, 파일 목록(ArrayList)
        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;
        }
        /// 
        /// 압축 파일 풀기
        /// 
        /// ZIP파일 경로
        /// 압축 풀 폴더 경로
        /// 해지 암호
        /// zip파일 삭제 여부
        /// 압축 풀기 성공 여부 
        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;
        }
    }
 

} 
 




SharpZipLib_0860_Bin.zip



반응형

'C#' 카테고리의 다른 글

DataSet to List  (0) 2015.08.21
c# 참고할 만한 사이트 목록  (0) 2015.08.21
소켓 관련 정보 블로그  (0) 2015.08.21
날짜 표현 형식  (0) 2015.08.19
바이너리 파일 저장  (0) 2015.08.19

댓글