닷넷 프레임워크 2.0부터 기본 라이브러리로 압축 관련 라이브러리가 있습니다만
이것은 기본적으로 하나의 파일만 압축이 가능합니다.

닷넷에서 사용하기 좋은 압축 라이브러리로 SharpZipLib 라는 것이 있습니다.
복수 개의 파일을 압축/해제가 가능하며 압축 레벨이나 패스워드 설정도 가능합니다.

저는 이것을 이번에 사내 패치 시스템을 만들 때 사용했습니다.

SharpZipLib은 아래의 사이트에서 얻을 수 있습니다.
SharpZipLib : http://icsharpcode.net/OpenSource/SharpZipLib/Default.aspx

제가 이 라이브러리를 사용하는 것에 대한 방법은 아래의 사이트에서 참조했습니다.
아래 제가 올린 소스는 이 사이트에서 소개하고 있는 것과 거의 같습니다.
http://dobon.net/vb/dotnet/links/createzipfile.html


// 압축
void Compression()
{
    try
    {
        string zipPath = "test.zip";
        System.IO.FileStream writer = new System.IO.FileStream( zipPath,
                                        System.IO.FileMode.Create,
                                         System.IO.FileAccess.Write, System.IO.FileShare.Write);
       
        ICSharpCode.SharpZipLib.Zip.ZipOutputStream zos =
                            new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(writer);
       
        foreach (string file in DiffFiles)
        {
            int Substringindex = textBox2.Text.Length;
            string f = file.Substring(Substringindex + 1);
           
            ICSharpCode.SharpZipLib.Zip.ZipEntry ze =
                                     new ICSharpCode.SharpZipLib.Zip.ZipEntry(f);

            System.IO.FileStream fs = new System.IO.FileStream( file,
                             System.IO.FileMode.Open, System.IO.FileAccess.Read,
                                  System.IO.FileShare.Read);
           
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            fs.Close();
           
            ze.Size = buffer.Length;
           
            ze.DateTime = DateTime.Now;

            // 새로운 엔트리(파일)을 넣는다.
            zos.PutNextEntry(ze);
           
            // 쓰기
            zos.Write(buffer, 0, buffer.Length);
        }

        zos.Close();
        writer.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}


// 해제
void DeCompression(string filename)
{
    string zipPath = filename;
    string extractDir = Environment.CurrentDirectory;

    System.IO.FileStream fs = new System.IO.FileStream( zipPath,
                                         System.IO.FileMode.Open,
                                 System.IO.FileAccess.Read, System.IO.FileShare.Read);
   
    ICSharpCode.SharpZipLib.Zip.ZipInputStream zis =
                            new ICSharpCode.SharpZipLib.Zip.ZipInputStream(fs);

    ICSharpCode.SharpZipLib.Zip.ZipEntry ze;
   
    while ((ze = zis.GetNextEntry()) != null)
    {
        if (!ze.IsDirectory)
        {
            string fileName = System.IO.Path.GetFileName(ze.Name);

            string destDir = System.IO.Path.Combine(extractDir,
                             System.IO.Path.GetDirectoryName(ze.Name));
           
            if (false == Directory.Exists(destDir))
            {
                System.IO.Directory.CreateDirectory(destDir);
            }

            string destPath = System.IO.Path.Combine(destDir, fileName);

            System.IO.FileStream writer = new System.IO.FileStream(
                            destPath, System.IO.FileMode.Create,
                                    System.IO.FileAccess.Write,
                                        System.IO.FileShare.Write);

            byte[] buffer = new byte[2048];
            int len;
            while ((len = zis.Read(buffer, 0, buffer.Length)) > 0)
            {
                writer.Write(buffer, 0, len);
            }

            writer.Close();
        }
    }

    zis.Close();
    fs.Close();
}


신고
by 흥배 2009.03.21 12:04
| 1 |

티스토리 툴바