美文网首页
C# 文件解压缩 zip

C# 文件解压缩 zip

作者: Rinaloving | 来源:发表于2022-05-30 13:56 被阅读0次

    代码

    /// <summary>  
        /// 文件(夹)压缩、解压缩  
        /// </summary>  
        public class FileCompression
        {
            #region 压缩文件
            /// <summary>    
            /// 压缩文件    
            /// </summary>    
            /// <param name="fileNames">要打包的文件列表</param>    
            /// <param name="GzipFileName">目标文件名</param>    
            /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
            /// <param name="deleteFile">是否删除原文件</param>  
            public static void CompressFile(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, bool deleteFile)
            {
                ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName));
                try
                {
                    s.SetLevel(CompressionLevel);   //0 - store only to 9 - means best compression    
                    foreach (FileInfo file in fileNames)
                    {
                        FileStream fs = null;
                        try
                        {
                            fs = file.Open(FileMode.Open, FileAccess.ReadWrite);
                        }
                        catch
                        { continue; }
                        //  方法二,将文件分批读入缓冲区    
                        byte[] data = new byte[2048];
                        int size = 2048;
                        ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
                        entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);
                        s.PutNextEntry(entry);
                        while (true)
                        {
                            size = fs.Read(data, 0, size);
                            if (size <= 0) break;
                            s.Write(data, 0, size);
                        }
                        fs.Close();
                        if (deleteFile)
                        {
                            file.Delete();
                        }
                    }
                }
                finally
                {
                    s.Finish();
                    s.Close();
                }
            }
            /// <summary>    
            /// 压缩文件夹    
            /// </summary>    
            /// <param name="dirPath">要打包的文件夹</param>    
            /// <param name="GzipFileName">目标文件名</param>    
            /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
            /// <param name="deleteDir">是否删除原文件夹</param>  
            public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir)
            {
                //压缩文件为空时默认与压缩文件夹同一级目录    
                if (GzipFileName == string.Empty)
                {
                    GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1);
                    GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip";
                }
    
                //if (Path.GetExtension(GzipFileName) != ".zip")  
                //{  
                //    GzipFileName = GzipFileName + ".zip";  
                //}  
                using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))
                {
                    zipoutputstream.SetLevel(CompressionLevel);
                    Crc32 crc = new Crc32();
                    Dictionary<string, DateTime> fileList = GetAllFies(dirPath);
                    foreach (KeyValuePair<string, DateTime> item in fileList)
                    {
                        FileStream fs = File.OpenRead(item.Key.ToString());
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));
                        entry.DateTime = item.Value;
                        entry.Size = fs.Length;
                        fs.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        zipoutputstream.PutNextEntry(entry);
                        zipoutputstream.Write(buffer, 0, buffer.Length);
                    }
                }
                if (deleteDir)
                {
                    Directory.Delete(dirPath, true);
                }
            }
    
            /// <summary>    
            /// 压缩文件夹    
            /// </summary>    
            /// <param name="dirPath">要打包的文件夹</param>    
            /// <param name="GzipFileName">目标文件名</param>    
            /// <param name="CompressionLevel">压缩品质级别(0~9)</param>    
            /// <param name="deleteDir">是否删除原文件夹</param>  
            public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir, out int fileNum)
            {
                //压缩文件为空时默认与压缩文件夹同一级目录    
                if (GzipFileName == string.Empty)
                {
                    GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1);
                    GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip";
                }
    
                //if (Path.GetExtension(GzipFileName) != ".zip")  
                //{  
                //    GzipFileName = GzipFileName + ".zip";  
                //}  
                using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))
                {
                    zipoutputstream.SetLevel(CompressionLevel);
                    Crc32 crc = new Crc32();
                    Dictionary<string, DateTime> fileList = GetAllFies(dirPath);
                    fileNum = fileList.Count;
                    foreach (KeyValuePair<string, DateTime> item in fileList)
                    {
                        FileStream fs = File.OpenRead(item.Key.ToString());
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);
                        ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));
                        entry.DateTime = item.Value;
                        entry.Size = fs.Length;
                        fs.Close();
                        crc.Reset();
                        crc.Update(buffer);
                        entry.Crc = crc.Value;
                        zipoutputstream.PutNextEntry(entry);
                        zipoutputstream.Write(buffer, 0, buffer.Length);
                    }
                }
                if (deleteDir)
                {
                    Directory.Delete(dirPath, true);
                }
            }
            /// <summary>    
            /// 获取所有文件    
            /// </summary>    
            /// <returns></returns>    
            private static Dictionary<string, DateTime> GetAllFies(string dir)
            {
                Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>();
                DirectoryInfo fileDire = new DirectoryInfo(dir);
                if (!fileDire.Exists)
                {
                    throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
                }
                GetAllDirFiles(fileDire, FilesList);
                GetAllDirsFiles(fileDire.GetDirectories(), FilesList);
                return FilesList;
            }
            /// <summary>    
            /// 获取一个文件夹下的所有文件夹里的文件    
            /// </summary>    
            /// <param name="dirs"></param>    
            /// <param name="filesList"></param>    
            private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList)
            {
                foreach (DirectoryInfo dir in dirs)
                {
                    foreach (FileInfo file in dir.GetFiles("*.*"))
                    {
                        filesList.Add(file.FullName, file.LastWriteTime);
                    }
                    GetAllDirsFiles(dir.GetDirectories(), filesList);
                }
            }
            /// <summary>    
            /// 获取一个文件夹下的文件    
            /// </summary>    
            /// <param name="dir">目录名称</param>    
            /// <param name="filesList">文件列表HastTable</param>    
            private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList)
            {
                foreach (FileInfo file in dir.GetFiles("*.*"))
                {
                    filesList.Add(file.FullName, file.LastWriteTime);
                }
            }
            #endregion
            #region 解压缩文件
            /// <summary>    
            /// 解压缩文件    
            /// </summary>    
            /// <param name="GzipFile">压缩包文件名</param>    
            /// <param name="targetPath">解压缩目标路径</param>           
            public static void Decompress(string GzipFile, string targetPath)
            {
                //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";    
                string directoryName = targetPath;
                if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录    
                string CurrentDirectory = directoryName;
                byte[] data = new byte[2048];
                int size = 2048;
                ZipEntry theEntry = null;
                using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))
                {
                    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        if (theEntry.IsDirectory)
                        {// 该结点是目录    
                            if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);
                        }
                        else
                        {
                            if (theEntry.Name != String.Empty)
                            {
                                //  检查多级目录是否存在  
                                if (theEntry.Name.Contains("//"))
                                {
                                    string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1);
                                    if (!Directory.Exists(parentDirPath))
                                    {
                                        Directory.CreateDirectory(CurrentDirectory + parentDirPath);
                                    }
                                }
    
                                //解压文件到指定的目录    
                                using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))
                                {
                                    while (true)
                                    {
                                        size = s.Read(data, 0, data.Length);
                                        if (size <= 0) break;
                                        streamWriter.Write(data, 0, size);
                                    }
                                    streamWriter.Close();
                                }
                            }
                        }
                    }
                    s.Close();
                }
            }
            #endregion
        }
    
    SharpZipLib.png

    补充 解压zip包

    /// <summary>    
            /// 解压缩文件    
            /// </summary>    
            /// <param name="GzipFile">压缩包文件名</param>    
            /// <param name="targetPath">解压缩目标路径</param>           
            public static void Decompress(string GzipFile, string targetPath)
            {
                //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";    
                string directoryName = targetPath;
                if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录    
                string CurrentDirectory = directoryName;
                byte[] data = new byte[2048];
                int size = 2048;
                ZipEntry theEntry = null;
                using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))
                {
                    while ((theEntry = s.GetNextEntry()) != null)
                    {
                        if (theEntry.IsDirectory)
                        {// 该结点是目录    
                            if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);
                        }
                        else
                        {
                            //创建父级目录,防止Entry文件,解压时由于目录不存在报异常
                            var file = CurrentDirectory+ "\\" + theEntry.Name;
                            Directory.CreateDirectory(Path.GetDirectoryName(file));
                            if (theEntry.Name != String.Empty)
                            {
                                //  检查多级目录是否存在  
                                if (theEntry.Name.Contains(Path.DirectorySeparatorChar.ToString()))
                                {
                                    string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf(Path.DirectorySeparatorChar) + 1);
                                    if (!Directory.Exists(parentDirPath))
                                    {
                                        Directory.CreateDirectory(CurrentDirectory + parentDirPath);
                                    }
                                }
    
                                //解压文件到指定的目录    
                                using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))
                                {
                                    while (true)
                                    {
                                        size = s.Read(data, 0, data.Length);
                                        if (size <= 0) break;
                                        streamWriter.Write(data, 0, size);
                                    }
                                    streamWriter.Close();
                                }
                            }
                        }
                    }
                    s.Close();
                }
            }
    
    

    相关文章

      网友评论

          本文标题:C# 文件解压缩 zip

          本文链接:https://www.haomeiwen.com/subject/ipysrktx.html