当前位置:首页 > Windows程序 > 正文

C# GZipStream 压缩 解压

2021-03-16 Windows程序

关于GZipStream压缩解压,网上找了很多资料,完整的不多,要么是针对字符串压缩解压缩的,要么只实现了针对单个文件的压缩解压缩,还有的不支持子文件夹的压缩,实用性都不是很大。

      以下整理了压缩解压缩的代码,供以后拿出来翻阅,在项目中可以直接使用这3个类,已通过测试。

1.首先是有一个描述要压缩的文件类GZipFileInfo,包含了一些文件信息

/// <summary>
/// 要压缩的文件信息
/// </summary>
public class GZipFileInfo
{
/// <summary>
/// 文件索引
/// </summary>
public int Index = 0;
/// <summary>
/// 文件相对路径,‘/‘
/// </summary>
public string RelativePath = null;
public DateTime ModifiedDate;
/// <summary>
/// 文件内容长度
/// </summary>
public int Length = 0;
public bool AddedToTempFile = false;
public bool RestoreRequested = false;
public bool Restored = false;
/// <summary>
/// 文件绝对路径,‘\‘
/// </summary>
public string LocalPath = null;
public string Folder = null;

public bool ParseFileInfo(string fileInfo)
{
bool success = false;
try
{
if (!string.IsNullOrEmpty(fileInfo))
{
// get the file information
string[] info = fileInfo.Split(‘,‘);
if (info != null && info.Length == 4)
{
this.Index = Convert.ToInt32(info[0]);
this.RelativePath = info[1].Replace("http://www.mamicode.com/", "\\");
this.ModifiedDate = Convert.ToDateTime(info[2]);
this.Length = Convert.ToInt32(info[3]);
success = true;
}
}
}
catch
{
success = false;
}
return success;
}
}

2.压缩后生成的压缩包信息GZipResult,描述了压缩包的一些属性,包括大小,,文件数,以及其中的每一个文件

/// <summary>
/// 文件压缩后的压缩包类
/// </summary>
public class GZipResult
{
/// <summary>
/// 压缩包中包含的所有文件,包括子目录下的文件
/// </summary>
public GZipFileInfo[] Files = null;
/// <summary>
/// 要压缩的文件数
/// </summary>
public int FileCount = 0;
public long TempFileSize = 0;
public long ZipFileSize = 0;
/// <summary>
/// 压缩百分比
/// </summary>
public int CompressionPercent = 0;
/// <summary>
/// 临时文件
/// </summary>
public string TempFile = null;
/// <summary>
/// 压缩文件
/// </summary>
public string ZipFile = null;
/// <summary>
/// 是否删除临时文件
/// </summary>
public bool TempFileDeleted = false;
public bool Errors = false;
}


3.压缩操作类GZip,包括压缩解压等操作

?

/// <summary>

/// 压缩文件类

/// </summary>

public class GZip

{

    /// <summary>

    /// Compress

    /// </summary>

    /// <param>The location of the files to include in the zip file, all files including files in subfolders will be included.</param>

    /// <param>Folder to write the zip file into</param>

    /// <param>Name of the zip file to write</param>

    public static GZipResult Compress(string lpSourceFolder, string lpDestFolder, string zipFileName)

    {

        return Compress(lpSourceFolder, "*.*", SearchOption.AllDirectories, lpDestFolder, zipFileName, true);

    }

 

    /// <summary>

    /// Compress

    /// </summary>

    /// <param>The location of the files to include in the zip file</param>

    /// <param>Search pattern (ie "*.*" or "*.txt" or "*.gif") to idendify what files in lpSourceFolder to include in the zip file</param>

    /// <param>Only files in lpSourceFolder or include files in subfolders also</param>

    /// <param>Folder to write the zip file into</param>

    /// <param>Name of the zip file to write</param>

    /// <param>Boolean, true deleted the intermediate temp file, false leaves the temp file in lpDestFolder (for debugging)</param>

    public static GZipResult Compress(string lpSourceFolder, string searchPattern, SearchOption searchOption, string lpDestFolder, string zipFileName, bool deleteTempFile)

    {

        DirectoryInfo di = new DirectoryInfo(lpSourceFolder);

        FileInfo[] files = di.GetFiles("*.*", searchOption);

        return Compress(files, lpSourceFolder, lpDestFolder, zipFileName, deleteTempFile);

    }

 

    /// <summary>

    /// Compress

    /// </summary>

    /// <param>Array of FileInfo objects to be included in the zip file</param>

    /// <param>Base folder to use when creating relative paths for the files

    /// stored in the zip file. For example, if lpBaseFolder is ‘C:\zipTest\Files\‘, and there is a file

    /// ‘C:\zipTest\Files\folder1\sample.txt‘ in the ‘files‘ array, the relative path for sample.txt

    /// will be ‘folder1/sample.txt‘</param>

    /// <param>Folder to write the zip file into</param>

    /// <param>Name of the zip file to write</param>

    public static GZipResult Compress(FileInfo[] files, string lpBaseFolder, string lpDestFolder, string zipFileName)

    {

        return Compress(files, lpBaseFolder, lpDestFolder, zipFileName, true);

    }

 

    /// <summary>

    /// Compress

    /// </summary>

    /// <param>Array of FileInfo objects to be included in the zip file</param>

    /// <param>Base folder to use when creating relative paths for the files

    /// stored in the zip file. For example, if lpBaseFolder is ‘C:\zipTest\Files\‘, and there is a file

    /// ‘C:\zipTest\Files\folder1\sample.txt‘ in the ‘files‘ array, the relative path for sample.txt

    /// will be ‘folder1/sample.txt‘</param>

    /// <param>Folder to write the zip file into</param>

    /// <param>Name of the zip file to write</param>

    /// <param>Boolean, true deleted the intermediate temp file, false leaves the temp file in lpDestFolder (for debugging)</param>

    public static GZipResult Compress(FileInfo[] files, string lpBaseFolder, string lpDestFolder, string zipFileName, bool deleteTempFile)

    {

        GZipResult result = new GZipResult();

 

        try

        {

            if (!lpDestFolder.EndsWith("\\"))

            {

                lpDestFolder += "\\";

            }

 

            string lpTempFile = lpDestFolder + zipFileName + ".tmp";

            string lpZipFile = lpDestFolder + zipFileName;

 

            result.TempFile = lpTempFile;

            result.ZipFile = lpZipFile;

 

            if (files != null && files.Length > 0)

            {

                CreateTempFile(files, lpBaseFolder, lpTempFile, result);

 

                if (result.FileCount > 0)

                {

                    CreateZipFile(lpTempFile, lpZipFile, result);

                }

 

                // delete the temp file

                if (deleteTempFile)

                {

                    File.Delete(lpTempFile);

                    result.TempFileDeleted = true;

                }

            }

        }

        catch //(Exception ex4)

        {

            result.Errors = true;

        }

        return result;

    }

 

    private static void CreateZipFile(string lpSourceFile, string lpZipFile, GZipResult result)

    {

        byte[] buffer;

        int count = 0;

        FileStream fsOut = null;

        FileStream fsIn = null;

        GZipStream gzip = null;

 

        // compress the file into the zip file

        try

        {

            fsOut = new FileStream(lpZipFile, FileMode.Create, FileAccess.Write, FileShare.None);

            gzip = new GZipStream(fsOut, CompressionMode.Compress, true);

 

            fsIn = new FileStream(lpSourceFile, FileMode.Open, FileAccess.Read, FileShare.Read);

            buffer = new byte[fsIn.Length];

            count = fsIn.Read(buffer, 0, buffer.Length);

            fsIn.Close();

            fsIn = null;

 

            // compress to the zip file

            gzip.Write(buffer, 0, buffer.Length);

 

            result.ZipFileSize = fsOut.Length;

            result.CompressionPercent = GetCompressionPercent(result.TempFileSize, result.ZipFileSize);

        }

        catch //(Exception ex1)

        {

            result.Errors = true;

        }

        finally

        {

            if (gzip != null)

            {

                gzip.Close();

                gzip = null;

            }

            if (fsOut != null)

            {

                fsOut.Close();

                fsOut = null;

            }

            if (fsIn != null)

            {

                fsIn.Close();

                fsIn = null;

            }

        }

    }

 

    private static void CreateTempFile(FileInfo[] files, string lpBaseFolder, string lpTempFile, GZipResult result)

    {

        byte[] buffer;

        int count = 0;

        byte[] header;

        string fileHeader = null;

        string fileModDate = null;

        string lpFolder = null;

        int fileIndex = 0;

        string lpSourceFile = null;

        string vpSourceFile = null;

        GZipFileInfo gzf = null;

        FileStream fsOut = null;

        FileStream fsIn = null;

 

        if (files != null && files.Length > 0)

        {

            try

            {

                result.Files = new GZipFileInfo[files.Length];

 

                // open the temp file for writing

                fsOut = new FileStream(lpTempFile, FileMode.Create, FileAccess.Write, FileShare.None);

 

                foreach (FileInfo fi in files)

                {

                    lpFolder = fi.DirectoryName + "\\";

                    try

                    {

                        gzf = new GZipFileInfo();

                        gzf.Index = fileIndex;

 

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/61920.html