惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
J
Java Code Geeks
I
InfoQ
V
Visual Studio Blog
M
MIT News - Artificial intelligence
H
Help Net Security
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
A
About on SuperTechFans
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Last Week in AI
Last Week in AI
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
WordPress大学
WordPress大学

博客园 - aiya

Effective C# Item 35: Prefer Overrides to Event Handlers Effective C# Item 40: Match Your Collection to Your Needs 为程序添加自己的跟踪侦听器 Effective C# Item 31: Prefer Small, Simple Functions Effective C# Item 30: Prefer CLS-Compliant Assemblies Chapter 4 Create Binary Components Effective C# Item 29: Use the new Modifier Only When Base Class Updates Mandate it Effective C# Item 28: Avoid Conversion Operators Effective C# Item 27: Avoid ICloneable Effective C# Item 26: Implement Ordering Relations with IComparable and IComparer 阿迪耐斯 Effective C# Item 25: Prefer Serializable Type Effective C# Item 24: Prefer Declarative to Imperative Programming Effective C# Item 23: Avoid Returning References to Internal Class Objects Effective C# Item 22: Define Outgoing Interface With Events Effective C# Item 21: Express Callbacks with Delegates Effective C# Item 20: Distinguish Between Implementing Interfaces and Overriding Virtual Functions Effective C# Item19: Prefer Defining and Implementing Interfaces to Inheritance Effective C# Item18: Implement the Standard Dispose Pattern
使用GZipStream类压缩和解压文件夹
aiya · 2006-11-30 · via 博客园 - aiya

      因为要求的压缩和解压非常简单,只有一级目录,而且文件很小,就没有使用SharpZipLib而是自己用.Net 2.0中的GZipStream类写了个简单的。将保存每个文件内容的byte数组和文件名的一个类型的示例放入arraylist里,再对其序列化,压缩序列化的流并保存为压缩包。其实对于多级目录在压缩时对其文件进行递归并在解压时根据文件名称和路径重新构建文件目录就也可以实现了。

using System;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;
using System.IO;
using System.IO.Compression;

namespace GreatCHN.GZipCompression
{
    
public class GZipCompress
    
{
        
/// <summary>
        
/// 对目标文件夹进行压缩,将压缩结果保存为指定文件
        
/// </summary>
        
/// <param name="dirPath">目标文件夹</param>
        
/// <param name="fileName">压缩文件</param>

        public static void Compress(string dirPath, string fileName)
        
{
            ArrayList list 
= new ArrayList();
            
foreach (string f in Directory.GetFiles(dirPath))
            
{
                
byte[] destBuffer = File.ReadAllBytes(f);
                SerializeFileInfo sfi 
= new SerializeFileInfo(f, destBuffer);
                list.Add(sfi);
            }

            IFormatter formatter 
= new BinaryFormatter();
            
using (Stream s = new MemoryStream())
            
{
                formatter.Serialize(s, list);
                s.Position 
= 0;
                CreateCompressFile(s, fileName);
            }

        }


        
/// <summary>
        
/// 对目标压缩文件解压缩,将内容解压缩到指定文件夹
        
/// </summary>
        
/// <param name="fileName">压缩文件</param>
        
/// <param name="dirPath">解压缩目录</param>

        public static void DeCompress(string fileName, string dirPath)
        
{
            
using (Stream source = File.OpenRead(fileName))
            
{
                
using (Stream destination = new MemoryStream())
                
{
                    
using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))
                    
{
                        
byte[] bytes = new byte[4096];
                        
int n;
                        
while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
                        
{
                            destination.Write(bytes, 
0, n);
                        }

                    }

                    destination.Flush();
                    destination.Position 
= 0;
                    DeSerializeFiles(destination, dirPath);
                }

            }

        }


        
private static void DeSerializeFiles(Stream s, string dirPath)
        
{
            BinaryFormatter b 
= new BinaryFormatter();
            ArrayList list 
= (ArrayList)b.Deserialize(s);

            
foreach (SerializeFileInfo f in list)
            
{
                
string newName = dirPath + Path.GetFileName(f.FileName);
                
using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))
                
{
                    fs.Write(f.FileBuffer, 
0, f.FileBuffer.Length);
                    fs.Close();
                }

            }

        }


        
private static void CreateCompressFile(Stream source, string destinationName)
        
{
            
using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))
            
{
                
using (GZipStream output = new GZipStream(destination, CompressionMode.Compress))
                
{
                    
byte[] bytes = new byte[4096];
                    
int n;
                    
while ((n = source.Read(bytes, 0, bytes.Length)) != 0)
                    
{
                        output.Write(bytes, 
0, n);
                    }

                }

            }

        }


        [Serializable]
        
class SerializeFileInfo
        
{
            
public SerializeFileInfo(string name, byte[] buffer)
            
{
                fileName 
= name;
                fileBuffer 
= buffer;
            }


            
string fileName;
            
public string FileName
            
{
                
get
                
{
                    
return fileName;
                }

            }


            
byte[] fileBuffer;
            
public byte[] FileBuffer
            
{
                
get
                
{
                    
return fileBuffer;
                }

            }

        }

    }

}


      在System.IO.Compress命名空间下还有一个DeflateStream类,它使用Deflate 算法来进行压缩和解压,它和GZipStream的工作方式是一样的。

posted on 2006-11-30 09:23  aiya  阅读(6421)  评论()    收藏  举报