.NET中zip的压缩和解压

来源:互联网 发布:战舰世界mac 闪退 编辑:程序博客网 时间:2024/05/18 01:05

使用System.IO.Packaging在WindowsBase.dll程序集下,使用时需要添加对WindowsBase的引用。

文件夹压缩

/// <summary>        /// Add a folder along with its subfolders to a Package        /// </summary>        /// <param name="folderName">The folder to add</param>        /// <param name="compressedFileName">The package to create</param>        /// <param name="overrideExisting">Override exsisitng files</param>        /// <returns></returns>        static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)        {            if (folderName.EndsWith(@"\"))                folderName = folderName.Remove(folderName.Length - 1);            bool result = false;            if (!Directory.Exists(folderName))            {                return result;            }            if (!overrideExisting && File.Exists(compressedFileName))            {                return result;            }            try            {                using (Package package = Package.Open(compressedFileName, FileMode.Create))                {                    var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);                    foreach (string fileName in fileList)                    {                                               //The path in the package is all of the subfolders after folderName                        string pathInPackage;                        pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);                        Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));                        PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);                        using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))                        {                            fileStream.CopyTo(packagePartDocument.GetStream());                        }                    }                }                result = true;            }            catch (Exception e)            {                throw new Exception("Error zipping folder " + folderName, e);            }                       return result;        }

单文件压缩

/// <summary>        /// Compress a file into a ZIP archive as the container store        /// </summary>        /// <param name="fileName">The file to compress</param>        /// <param name="compressedFileName">The archive file</param>        /// <param name="overrideExisting">override existing file</param>        /// <returns></returns>        static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting)        {            bool result = false;            if (!File.Exists(fileName))            {                return result;            }            if (!overrideExisting && File.Exists(compressedFileName))            {                return result;            }            try            {                Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));                               using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))                {                    if (package.PartExists(partUriDocument))                    {                        package.DeletePart(partUriDocument);                    }                     PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);                    using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))                    {                        fileStream.CopyTo(packagePartDocument.GetStream());                    }                }                result = true;            }            catch (Exception e)            {                throw new Exception("Error zipping file " + fileName, e);            }                        return result;        }

zip文件解压

/// <summary>        /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification        /// </summary>        /// <param name="folderName">The folder to extract the package to</param>        /// <param name="compressedFileName">The package file</param>        /// <param name="overrideExisting">override existing files</param>        /// <returns></returns>        static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting)        {            bool result = false;            try            {                if (!File.Exists(compressedFileName))                {                    return result;                }                DirectoryInfo directoryInfo = new DirectoryInfo(folderName);                if (!directoryInfo.Exists)                    directoryInfo.Create();                using (Package package = Package.Open(compressedFileName, FileMode.Open, FileAccess.Read))                {                    foreach (PackagePart packagePart in package.GetParts())                    {                        ExtractPart(packagePart, folderName, overrideExisting);                    }                }                result = true;            }            catch (Exception e)            {                throw new Exception("Error unzipping file " + compressedFileName, e);            }                        return result;        }        static void ExtractPart(PackagePart packagePart, string targetDirectory, bool overrideExisting)        {            string stringPart = targetDirectory + HttpUtility.UrlDecode(packagePart.Uri.ToString()).Replace('\\', '/');            if (!Directory.Exists(Path.GetDirectoryName(stringPart)))                Directory.CreateDirectory(Path.GetDirectoryName(stringPart));            if (!overrideExisting && File.Exists(stringPart))                return;            using (FileStream fileStream = new FileStream(stringPart, FileMode.Create))            {                packagePart.GetStream().CopyTo(fileStream);            }        }
 使用Package压缩文件会在zip文件自动生成[Content_Type].xml,用来描述zip文件解压支持的文件格式。

<?xml version="1.0" encoding="utf-8" ?> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">    <Default Extension="vsixmanifest" ContentType="text/xml" />     <Default Extension="dll" ContentType="application/octet-stream" />     <Default Extension="png" ContentType="application/octet-stream" />     <Default Extension="txt" ContentType="text/plain" />     <Default Extension="pkgdef" ContentType="text/plain" /> </Types>


0 0
原创粉丝点击