当前位置:首页 > C#教程 > C#高级

C# 文件/文件夹压缩解压缩

项目上用到的,随手做个记录,哈哈。

直接上代码:

技术分享图片 技术分享图片
                  1
                using
                 System;

                  2
                using
                 System.Data;

                  3
                using
                 System.Configuration;

                  4
                using
                 System.Collections.Generic;

                  5
                using
                 System.IO;

                  6
                using
                 ICSharpCode.SharpZipLib.Zip;

                  7
                using
                 ICSharpCode.SharpZipLib.Checksums;

                  8
                namespace
                 BLL

                  9
                {

                 10
                ///
                <summary>
                 11
                ///
                 文件(夹)压缩、解压缩  

                 12
                ///
                </summary>
                 13
                public
                class
                 FileCompression

                 14
                    {

                 15
                #region 压缩文件
 16///<summary> 17/// 压缩文件    
 18///</summary> 19///<param name="fileNames">要打包的文件列表</param> 20///<param name="GzipFileName">目标文件名</param> 21///<param name="CompressionLevel">压缩品质级别(0~9)</param> 22///<param name="deleteFile">是否删除原文件</param> 23publicstaticvoid CompressFile(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, bool deleteFile)
 24        {
 25             ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName));
 26try 27            {
 28                 s.SetLevel(CompressionLevel);   //0 - store only to 9 - means best compression     29foreach (FileInfo file in fileNames)
 30                {
 31                     FileStream fs = null;
 32try 33                    {
 34                         fs = file.Open(FileMode.Open, FileAccess.ReadWrite);
 35                    }
 36catch 37                     { continue; }
 38//  方法二,将文件分批读入缓冲区     39byte[] data = newbyte[2048];
 40int size = 2048;
 41                     ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
 42                     entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);
 43                    s.PutNextEntry(entry);
 44while (true)
 45                    {
 46                         size = fs.Read(data, 0, size);
 47if (size <= 0) break;
 48                         s.Write(data, 0, size);
 49                    }
 50                    fs.Close();
 51if (deleteFile)
 52                    {
 53                        file.Delete();
 54                    }
 55                }
 56            }
 57finally 58            {
 59                s.Finish();
 60                s.Close();
 61            }
 62        }
 63///<summary> 64/// 压缩文件夹    
 65///</summary> 66///<param name="dirPath">要打包的文件夹</param> 67///<param name="GzipFileName">目标文件名</param> 68///<param name="CompressionLevel">压缩品质级别(0~9)</param> 69///<param name="deleteDir">是否删除原文件夹</param> 70publicstaticvoid CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir)
 71        {
 72//压缩文件为空时默认与压缩文件夹同一级目录     73if (GzipFileName == string.Empty)
 74            {
 75                 GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1);
 76                 GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip";
 77            }
 78//if (Path.GetExtension(GzipFileName) != ".zip")  
 79//{  
 80//    GzipFileName = GzipFileName + ".zip";  
 81//}   82using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName)))
 83            {
 84                zipoutputstream.SetLevel(CompressionLevel);
 85                 Crc32 crc = new Crc32();
 86                 Dictionary<string, DateTime> fileList = GetAllFies(dirPath);
 87foreach (KeyValuePair<string, DateTime> item in fileList)
 88                {
 89                     FileStream fs = File.OpenRead(item.Key.ToString());
 90byte[] buffer = newbyte[fs.Length];
 91                     fs.Read(buffer, 0, buffer.Length);
 92                     ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length));
 93                     entry.DateTime = item.Value;
 94                     entry.Size = fs.Length;
 95                    fs.Close();
 96                    crc.Reset();
 97                    crc.Update(buffer);
 98                     entry.Crc = crc.Value;
 99                    zipoutputstream.PutNextEntry(entry);
100                     zipoutputstream.Write(buffer, 0, buffer.Length);
101                }
102            }
103if (deleteDir)
104            {
105                 Directory.Delete(dirPath, true);
106            }
107        }
108///<summary>109/// 获取所有文件    
110///</summary>111///<returns></returns>112privatestatic Dictionary<string, DateTime> GetAllFies(string dir)
113        {
114             Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>();
115             DirectoryInfo fileDire = new DirectoryInfo(dir);
116if (!fileDire.Exists)
117            {
118thrownew System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
119            }
120            GetAllDirFiles(fileDire, FilesList);
121            GetAllDirsFiles(fileDire.GetDirectories(), FilesList);
122return FilesList;
123        }
124///<summary>125/// 获取一个文件夹下的所有文件夹里的文件    
126///</summary>127///<param name="dirs"></param>128///<param name="filesList"></param>129privatestaticvoid GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList)
130        {
131foreach (DirectoryInfo dir in dirs)
132            {
133foreach (FileInfo file in dir.GetFiles("*.*"))
134                {
135                    filesList.Add(file.FullName, file.LastWriteTime);
136                }
137                GetAllDirsFiles(dir.GetDirectories(), filesList);
138            }
139        }
140///<summary>141/// 获取一个文件夹下的文件    
142///</summary>143///<param name="dir">目录名称</param>144///<param name="filesList">文件列表HastTable</param>145privatestaticvoid GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList)
146        {
147foreach (FileInfo file in dir.GetFiles("*.*"))
148            {
149                filesList.Add(file.FullName, file.LastWriteTime);
150            }
151        }
152#endregion153#region 解压缩文件
154///<summary>155/// 解压缩文件    
156///</summary>157///<param name="GzipFile">压缩包文件名</param>158///<param name="targetPath">解压缩目标路径</param>159publicstaticvoid Decompress(string GzipFile, string targetPath)
160        {
161//string directoryName = Path.GetDirectoryName(targetPath + "//") + "//";    162string directoryName = targetPath;
163if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录    164string CurrentDirectory = directoryName;
165byte[] data = newbyte[2048];
166int size = 2048;
167             ZipEntry theEntry = null;
168using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile)))
169            {
170while ((theEntry = s.GetNextEntry()) != null)
171                {
172if (theEntry.IsDirectory)
173                     {// 该结点是目录    174if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name);
175                    }
176else177                    {
178if (theEntry.Name != String.Empty)
179                        {
180//  检查多级目录是否存在  181if (theEntry.Name.Contains("//"))
182                            {
183string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1);
184if (!Directory.Exists(parentDirPath))
185                                {
186                                     Directory.CreateDirectory(CurrentDirectory + parentDirPath);
187                                }
188                            }
189190//解压文件到指定的目录    191using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name))
192                            {
193while (true)
194                                {
195                                     size = s.Read(data, 0, data.Length);
196if (size <= 0) break;
197                                     streamWriter.Write(data, 0, size);
198                                }
199                                streamWriter.Close();
200                            }
201                        }
202                    }
203                }
204                s.Close();
205            }
206        }
207#endregion208    }
209 }
View Code

封装的很彻底,基本不用修改什么,直接拿来用就行了。

找了很久,终于知道怎么把源代码附上了

源代码:https://files.cnblogs.com/files/hahahayang/C%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.zip

原文:https://www.cnblogs.com/hahahayang/p/hahahayang.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐