zoukankan      html  css  js  c++  java
  • [No0000DF]C# ZipFileHelper ZIP类型操作,压缩解压 ZIP 类封装

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.IO.Compression;
    using System.Linq;
    using System.Text.RegularExpressions;
    using System.Windows.Forms;
    using Shared;
    
    namespace Helpers
    {
        public static class ZipFileHelper
    
        {
            #region  Methods
    
            /// <summary>
            ///     创建 zip 存档,该存档包含指定目录的文件和目录。
            /// </summary>
            /// <param name="sourceDirectoryName">要存档的目录的路径,指定为相对路径或绝对路径。 相对路径是指相对于当前工作目录的路径。</param>
            /// <param name="destinationArchiveFileName">要生成的存档路径,指定为相对路径或绝对路径。 相对路径是指相对于当前工作目录的路径。</param>
            /// <param name="compressionLevel"></param>
            /// <param name="includeBaseDirectory">压缩包中是否包含父目录</param>
            public static bool CreatZipFileFromDirectory(string sourceDirectoryName, string destinationArchiveFileName,
                CompressionLevel compressionLevel = CompressionLevel.NoCompression,
                bool includeBaseDirectory = true)
            {
                try
                {
                    if (Directory.Exists(sourceDirectoryName)) //目录
                        if (!File.Exists(destinationArchiveFileName))
                        {
                            ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName,
                                compressionLevel, includeBaseDirectory);
                        }
                        else
                        {
                            var toZipFileDictionaryList = GetAllDirList(sourceDirectoryName, includeBaseDirectory);
    
                            using (
                                var archive = ZipFile.Open(destinationArchiveFileName, ZipArchiveMode.Update)
                            )
                            {
                                foreach (var toZipFileKey in toZipFileDictionaryList.Keys)
                                    if (toZipFileKey != destinationArchiveFileName)
                                    {
                                        var toZipedFileName = Path.GetFileName(toZipFileKey);
                                        var toDelArchives = new List<ZipArchiveEntry>();
                                        foreach (var zipArchiveEntry in archive.Entries)
                                            if (toZipedFileName != null &&
                                                (zipArchiveEntry.FullName.StartsWith(toZipedFileName) ||
                                                 toZipedFileName.StartsWith(zipArchiveEntry.FullName)))
                                                toDelArchives.Add(zipArchiveEntry);
                                        foreach (var zipArchiveEntry in toDelArchives)
                                            zipArchiveEntry.Delete();
                                        archive.CreateEntryFromFile(toZipFileKey, toZipFileDictionaryList[toZipFileKey],
                                            compressionLevel);
                                    }
                            }
                        }
                    else if (File.Exists(sourceDirectoryName))
                        if (!File.Exists(destinationArchiveFileName))
                            ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName,
                                compressionLevel, false);
                        else
                            using (
                                var archive = ZipFile.Open(destinationArchiveFileName, ZipArchiveMode.Update)
                            )
                            {
                                if (sourceDirectoryName != destinationArchiveFileName)
                                {
                                    var toZipedFileName = Path.GetFileName(sourceDirectoryName);
                                    var toDelArchives = new List<ZipArchiveEntry>();
                                    foreach (var zipArchiveEntry in archive.Entries)
                                        if (toZipedFileName != null &&
                                            (zipArchiveEntry.FullName.StartsWith(toZipedFileName) ||
                                             toZipedFileName.StartsWith(zipArchiveEntry.FullName)))
                                            toDelArchives.Add(zipArchiveEntry);
                                    foreach (var zipArchiveEntry in toDelArchives)
                                        zipArchiveEntry.Delete();
                                    archive.CreateEntryFromFile(sourceDirectoryName, toZipedFileName, compressionLevel);
                                }
                            }
                    else
                        return false;
                    return true;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    MessageBox.Show(exception.StackTrace, exception.Source);
                    return false;
                }
            }
    
            /// <summary>
            ///     创建 zip 存档,该存档包含指定目录的文件和目录。
            /// </summary>
            /// <param name="sourceDirectoryName">要存档的目录的路径,指定为相对路径或绝对路径。 相对路径是指相对于当前工作目录的路径。</param>
            /// <param name="destinationArchiveFileName">要生成的存档路径,指定为相对路径或绝对路径。 相对路径是指相对于当前工作目录的路径。</param>
            /// <param name="compressionLevel"></param>
            public static bool CreatZipFileFromDictionary(Dictionary<string, string> sourceDirectoryName,
                string destinationArchiveFileName,
                CompressionLevel compressionLevel = CompressionLevel.NoCompression)
            {
                try
                {
                    using (FileStream zipToOpen = new FileStream(destinationArchiveFileName, FileMode.OpenOrCreate))
                    {
                        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                        {
                            foreach (var toZipFileKey in sourceDirectoryName.Keys)
                                if (toZipFileKey != destinationArchiveFileName)
                                {
                                    var toZipedFileName = Path.GetFileName(toZipFileKey);
                                    var toDelArchives = new List<ZipArchiveEntry>();
                                    foreach (var zipArchiveEntry in archive.Entries)
                                        if (toZipedFileName != null &&
                                            (zipArchiveEntry.FullName.StartsWith(toZipedFileName) ||
                                             toZipedFileName.StartsWith(zipArchiveEntry.FullName)))
                                            toDelArchives.Add(zipArchiveEntry);
                                    foreach (var zipArchiveEntry in toDelArchives)
                                        zipArchiveEntry.Delete();
                                    archive.CreateEntryFromFile(toZipFileKey, sourceDirectoryName[toZipFileKey],
                                        compressionLevel);
                                }
                        }
                    }
                    return true;
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    MessageBox.Show(exception.StackTrace, exception.Source);
                    return false;
                }
            }
    
            /// <summary>
            ///     递归删除文件夹目录及文件
            /// </summary>
            /// <param name="baseDirectory"></param>
            /// <returns></returns>
            public static bool DeleteFolder(string baseDirectory)
            {
                var successed = true;
                try
                {
                    if (Directory.Exists(baseDirectory)) //如果存在这个文件夹删除之 
                    {
                        foreach (var directory in Directory.GetFileSystemEntries(baseDirectory))
                            if (File.Exists(directory))
                                File.Delete(directory); //直接删除其中的文件  
                            else
                                successed = DeleteFolder(directory); //递归删除子文件夹 
                        Directory.Delete(baseDirectory); //删除已空文件夹     
                    }
                }
                catch (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    successed = false;
                }
                return successed;
            }
    
            /// <summary>
            /// 调用bat删除目录,以防止系统底层的异步删除机制
            /// </summary>
            /// <param name="dirPath"></param>
            /// <returns></returns>
            public static bool DeleteDirectoryWithCmd(string dirPath)
            {
                var process = new Process(); //string path = ...;//bat路径  
                var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C rd /S /Q "" + dirPath + """)
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                }; //第二个参数为传入的参数,string类型以空格分隔各个参数  
                process.StartInfo = processStartInfo;
                process.Start();
                process.WaitForExit();
                var output = process.StandardOutput.ReadToEnd();
                if (string.IsNullOrWhiteSpace(output))
                    return true;
                return false;
            }
    
            /// <summary>
            /// 调用bat删除文件,以防止系统底层的异步删除机制
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static bool DelFileWithCmd(string filePath)
            {
                var process = new Process(); //string path = ...;//bat路径  
                var processStartInfo = new ProcessStartInfo("CMD.EXE", "/C del /F /S /Q "" + filePath + """)
                {
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                }; //第二个参数为传入的参数,string类型以空格分隔各个参数  
                process.StartInfo = processStartInfo;
                process.Start();
                process.WaitForExit();
                var output = process.StandardOutput.ReadToEnd();
                if (output.Contains(filePath))
                    return true;
                return false;
            }
    
            /// <summary>
            /// 获取目录下所有[文件名,要压缩的相对文件名]字典
            /// </summary>
            /// <param name="strBaseDir"></param>
            /// <param name="includeBaseDirectory"></param>
            /// <param name="namePrefix"></param>
            /// <returns></returns>
            public static Dictionary<string, string> GetAllDirList(string strBaseDir,
                bool includeBaseDirectory = false, string namePrefix = "")
            {
                var resultDictionary = new Dictionary<string, string>();
                var directoryInfo = new DirectoryInfo(strBaseDir);
                var directories = directoryInfo.GetDirectories();
                var fileInfos = directoryInfo.GetFiles();
                if (includeBaseDirectory)
                    namePrefix += directoryInfo.Name + "\";
                foreach (var directory in directories)
                    resultDictionary =
                        resultDictionary.Concat(GetAllDirList(directory.FullName, true, namePrefix))
                            .ToDictionary(k => k.Key, k => k.Value); //.FullName是某个子目录的绝对地址,
                foreach (var fileInfo in fileInfos)
                    if (!resultDictionary.ContainsKey(fileInfo.FullName))
                        resultDictionary.Add(fileInfo.FullName, namePrefix + fileInfo.Name);
                return resultDictionary;
            }
    
            /// <summary>
            ///     Zip解压并更新目标文件
            /// </summary>
            /// <param name="zipFilePath">Zip压缩包路径</param>
            /// <param name="unZipDir">解压目标路径</param>
            /// <returns></returns>
            public static bool UnZip(string zipFilePath, string unZipDir)
            {
                bool resualt;
                try
                {
                    unZipDir = unZipDir.EndsWith(@"") ? unZipDir : unZipDir + @"";
                    var directoryInfo = new DirectoryInfo(unZipDir);
                    if (!directoryInfo.Exists)
                        directoryInfo.Create();
                    var fileInfo = new FileInfo(zipFilePath);
                    if (!fileInfo.Exists)
                        return false;
                    using (
                        var zipToOpen = new FileStream(zipFilePath, FileMode.Open, FileAccess.ReadWrite,
                            FileShare.Read))
                    {
                        using (var archive = new ZipArchive(zipToOpen, ZipArchiveMode.Read))
                        {
                            foreach (var zipArchiveEntry in archive.Entries)
                                if (!zipArchiveEntry.FullName.EndsWith("/"))
                                {
                                    var entryFilePath = Regex.Replace(zipArchiveEntry.FullName.Replace("/", @""),
                                        @"^\*", "");
                                    var filePath = directoryInfo + entryFilePath; //设置解压路径
                                    var content = new byte[zipArchiveEntry.Length];
                                    zipArchiveEntry.Open().Read(content, 0, content.Length);
    
                                    if (File.Exists(filePath) && content.Length == new FileInfo(filePath).Length)
                                        continue; //跳过相同的文件,否则覆盖更新
    
                                    var sameDirectoryNameFilePath = new DirectoryInfo(filePath);
                                    if (sameDirectoryNameFilePath.Exists)
                                    {
                                        sameDirectoryNameFilePath.Delete(true);
                                        DeleteDirectoryWithCmd(filePath);
                                        /*if (!DeleteDirectoryWithCmd(filePath))
                                        {
                                            Console.WriteLine(filePath + "删除失败");
                                            resualt = false;
                                            break;
                                        }*/
                                    }
                                    var sameFileNameFilePath = new FileInfo(filePath);
                                    if (sameFileNameFilePath.Exists)
                                    {
                                        sameFileNameFilePath.Delete();
                                        DelFileWithCmd(filePath);
                                        /*if (!DelFileWithCmd(filePath))
                                        {
                                            Console.WriteLine(filePath + "删除失败");
                                            resualt = false;
                                            break;
                                        }*/
                                    }
                                    var greatFolder = Directory.GetParent(filePath);
                                    if (!greatFolder.Exists) greatFolder.Create();
                                    File.WriteAllBytes(filePath, content);
                                }
                        }
                    }
                    resualt = true;
                }
                catch
                    (Exception exception)
                {
                    LogHelper.LogError("Error! ", exception);
                    resualt = false;
                }
                    return resualt;
            }
    
            #endregion
        }
    }
  • 相关阅读:
    【Uvalive4960】 Sensor network (苗条树,进化版)
    【UVA 1151】 Buy or Build (有某些特别的东东的最小生成树)
    【UVA 1395】 Slim Span (苗条树)
    【UVA 10600】 ACM Contest and Blackout(最小生成树和次小生成树)
    【UVA 10369】 Arctic Network (最小生成树)
    【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
    【UVA 11183】 Teen Girl Squad (定根MDST)
    【UVA 11865】 Stream My Contest (二分+MDST最小树形图)
    【UVA 11354】 Bond (最小瓶颈生成树、树上倍增)
    【LA 5713 】 Qin Shi Huang's National Road System (MST)
  • 原文地址:https://www.cnblogs.com/Chary/p/No0000DF.html
Copyright © 2011-2022 走看看