zoukankan      html  css  js  c++  java
  • 使用GZipStream类压缩和解压文件夹

    因为要求的压缩和解压非常简单,只有一级目录,而且文件很小,就没有使用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的工作方式是一样的。
  • 相关阅读:
    C语言之数据类型(int float double char unsigned )
    c语言的第一个程序
    socket之udp服务器和客户端
    页面置换算法的模拟实现 C
    C算法--入门篇(1)图形输出
    C算法--入门篇(1)查找元素
    C算法--入门篇(1)入门模拟2
    C算法--入门篇(1)入门模拟1
    C算法--黑盒测试
    C算法--复杂度
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2003350.html
Copyright © 2011-2022 走看看