.NET 2.0 부터 GZip 압축 라이브러리가 생겼습니다.
하지만 이것은 기본적으로 하나의 파일만 압축이 가능합니다.

여러 개의 파일을 압축하는 방법은 3가지가 있습니다.

1. GZip 라이브러리 사용. 까다롭다.
http://www.vwd-cms.com/Forum/Forums.aspx?topic=18


2. 압축 관련 공개 라이브러리 사용
http://icsharpcode.net/OpenSource/SharpZipLib/Default.aspx


3. J#의 압축 라이브러리 사용
.NET Framework SDK를 설치 하지 않은 PC에는 VJSharp 재배포 패키지를 설치해야 된다.

출처 : http://dobon.net/vb/dotnet/links/createzipfile.html

압축

  1. java.io.FileOutputStream fos = new java.io.FileOutputStream(zipPath);
    java.util.zip.ZipOutputStream zos = new java.util.zip.ZipOutputStream(fos);

    // Zip 파일에 추가한다.
    foreach (string file in DiffFiles)
    {
            // ZIP에 추가 할 때의 파일 이름을 정한다.
            //string f = System.IO.Path.GetFileName(file);

            // 디렉토리를 보존할 때는 다음과 같이 한다.
            string f = file.Remove( 0, System.IO.Path.GetPathRoot(file).Length);
            f = f.Replace("\\","/");

            java.util.zip.ZipEntry ze = new java.util.zip.ZipEntry(f);
            ze.setMethod(java.util.zip.ZipEntry.DEFLATED);
            zos.putNextEntry(ze);

             // FileInputStream을 생성
             java.io.FileInputStream fis = new java.io.FileInputStream(file);
             
  2.           // 쓰기
             sbyte[] buffer = new sbyte[8192];
             int len;
             while ((len = fis.read(buffer, 0, buffer.Length)) > 0)
             {
                   zos.write(buffer, 0, len);
              }
             
  3.            // 닫는다
              fis.close();
              zos.closeEntry();
    }

    zos.close();
    fos.close();



해제

  1. // 풀 압축 파일의 이름
    string zipPath = filename;
    // 압축을 풀 곳의 디렉토리 설정
    string extractDir = Environment.CurrentDirectory;

    // 읽기
    java.io.FileInputStream fis = new java.io.FileInputStream(zipPath);
    java.util.zip.ZipInputStream zis = new java.util.zip.ZipInputStream(fis);

    // ZIP 내의 파일 정보를 취득
    java.util.zip.ZipEntry ze;
    while ((ze = zis.getNextEntry()) != null)
    {
           if (!ze.isDirectory())
           {
                   // 파일 이름
                   string fileName = System.IO.Path.GetFileName(ze.getName());
                   // 풀곳의 폴더
                   string destDir = System.IO.Path.Combine(extractDir, System.IO.Path.GetDirectoryName(ze.getName()));
                       
                   if( false == Directory.Exists(destDir) )
                   {
                          System.IO.Directory.CreateDirectory(destDir);
                    }

                     // 풀 곳의 패스
                    string destPath = System.IO.Path.Combine(destDir, fileName);
                    // FileOutputStream 생성
                    java.io.FileOutputStream fos = new java.io.FileOutputStream(destPath);

                    // 쓰기
                   sbyte[] buffer = new sbyte[8192];
                    int len;
                    while ((len = zis.read(buffer, 0, buffer.Length)) > 0)
                    {
                          fos.write(buffer, 0, len);
                     }

                     // 닫는다.
                     fos.close();
            }
    }
신고
by 흥배 2009.03.21 03:07
| 1 |