前言:
最近在做一个文件管理系统,其中需要用到大量的文件压缩和解压操作。应该说C#做这种文件压缩,解压操作还是比较简单的,因为C#本身就集成了很文件操作的类。比如比较常用的ZipFile等,今天我们就介绍一下用C#如何进行文件的压缩,解压操作。
文件压缩按键出发事件
private void button1_Click(object sender, EventArgs e) { try { // 堆代码 duidaima.com OpenFileDialog op= new OpenFileDialog(); //弹窗选择文件 if (op.ShowDialog() == DialogResult.OK) { string fileName=string.Empty, fileToZip = string.Empty, zipedFile = string.Empty; fileName = op.FileName;//弹窗选择文件的文件名 fileToZip = fileName;//待压缩文件目录 例:C:\Users\ZhongJinYuan\Desktop\上传\(材料设备类)附表-近五年工程案例明细表.xls zipedFile = ""; //压缩后的目标文件 ZipClass Zc = new ZipClass(); Zc.ZipFile(fileToZip, zipedFile,6); MessageBox.Show("压缩成功!"); } } catch (Exception ex) { MessageBox.Show(ex.Message.Trim()); } }ZipFile单个文件压缩方法
/// <summary> /// 堆代码 duidaima.com /// 压缩单个文件 /// </summary> /// <param name="FileToZip">被压缩的文件名称(包含文件路径)</param> /// <param name="ZipedFile">压缩后的文件名称(包含文件路径)</param> /// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param> /// <param name="BlockSize">缓存大小</param> public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel) { //如果文件没有找到,则报错 if (!System.IO.File.Exists(FileToZip)) { throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!"); } if (ZipedFile == string.Empty) { ZipedFile = Path.GetFileNameWithoutExtension(FileToZip) + ".zip"; } if (Path.GetExtension(ZipedFile) != ".zip") { ZipedFile = ZipedFile + ".zip"; } ////如果指定位置目录不存在,创建该目录 //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\")); //if (!Directory.Exists(zipedDir)) // Directory.CreateDirectory(zipedDir); //被压缩文件名称 string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\') + 1); System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile); ZipOutputStream ZipStream = new ZipOutputStream(ZipFile); ZipEntry ZipEntry = new ZipEntry(filename); ZipStream.PutNextEntry(ZipEntry); ZipStream.SetLevel(CompressionLevel); byte[] buffer = new byte[2048]; System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length); ZipStream.Write(buffer, 0, size); try { while (size < StreamToZip.Length) { int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); ZipStream.Write(buffer, 0, sizeRead); size += sizeRead; } } catch (System.Exception ex) { throw ex; } finally { ZipStream.Finish(); ZipStream.Close(); StreamToZip.Close(); } }文件夹压缩按键出发事件
private void button3_Click(object sender, EventArgs e) { try { FolderBrowserDialog fbd = new FolderBrowserDialog(); if (fbd.ShowDialog() == DialogResult.OK) { string dirName = string.Empty, dirToZip = string.Empty, zipedFile = string.Empty; dirToZip = fbd.SelectedPath;//待压缩文件夹 zipedFile = ""; //压缩后的目标文件 ZipClass Zc = new ZipClass(); Zc.ZipDir(dirToZip, zipedFile, 6); MessageBox.Show("压缩成功!"); } } catch (Exception ex) { MessageBox.Show(ex.Message.Trim()); } }ZipDir单个文件夹压缩方法
/// <summary> /// 压缩文件夹的方法 /// </summary> public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel) { //压缩文件为空时默认与压缩文件夹同一级目录 if (ZipedFile == string.Empty) { ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1); ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip"; } if (Path.GetExtension(ZipedFile) != ".zip") { ZipedFile = ZipedFile + ".zip"; } using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile))) { zipoutputstream.SetLevel(CompressionLevel); Crc32 crc = new Crc32(); Hashtable fileList = getAllFies(DirToZip); foreach (DictionaryEntry 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.ToString().Substring(DirToZip.Length + 1)); entry.DateTime = (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); } } } /// <summary> /// 获取所有文件 /// </summary> /// <returns></returns> private Hashtable getAllFies(string dir) { Hashtable FilesList = new Hashtable(); DirectoryInfo fileDire = new DirectoryInfo(dir); if (!fileDire.Exists) { throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); } this.getAllDirFiles(fileDire, FilesList); this.getAllDirsFiles(fileDire.GetDirectories(), FilesList); return FilesList; } /// <summary> /// 获取一个文件夹下的所有文件夹里的文件 /// </summary> /// <param name="dirs"></param> /// <param name="filesList"></param> private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList) { foreach (DirectoryInfo dir in dirs) { foreach (FileInfo file in dir.GetFiles("*.*")) { filesList.Add(file.FullName, file.LastWriteTime); } this.getAllDirsFiles(dir.GetDirectories(), filesList); } } /// <summary> /// 获取一个文件夹下的文件 /// </summary> /// <param name="strDirName">目录名称</param> /// <param name="filesList">文件列表HastTable</param> private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList) { foreach (FileInfo file in dir.GetFiles("*.*")) { filesList.Add(file.FullName, file.LastWriteTime); } }解压按键触发事件
private void button2_Click(object sender, EventArgs e) { try { OpenFileDialog op = new OpenFileDialog(); if (op.ShowDialog() == DialogResult.OK) { string fileName = string.Empty, UnZip = string.Empty, UnzipDir = string.Empty; fileName = op.FileName; UnZip = fileName;//待解压文件 UnzipDir = "";//fileName.Substring(0, fileName.LastIndexOf('\\')); //解压后的目录 UnZipClass Uzc = new UnZipClass(); Uzc.UnZip(UnZip, UnzipDir); MessageBox.Show("解压成功!"); } } catch (Exception ex) { MessageBox.Show(ex.Message.Trim()); } }UnZip解压方法
/// <summary> /// 功能:解压zip格式的文件。 /// </summary> /// <param name="zipFilePath">压缩文件路径</param> /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param> /// <param name="err">出错信息</param> /// <returns>解压是否成功</returns> public void UnZip(string zipFilePath, string unZipDir) { if (zipFilePath == string.Empty) { throw new Exception("压缩文件不能为空!"); } if (!File.Exists(zipFilePath)) { throw new System.IO.FileNotFoundException("压缩文件不存在!"); } //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹 if (unZipDir == string.Empty) unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); if (!unZipDir.EndsWith("\\")) unZipDir += "\\"; if (!Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir); using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (directoryName.Length > 0) { Directory.CreateDirectory(unZipDir + directoryName); } if (!directoryName.EndsWith("\\")) directoryName += "\\"; if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } }零散文件集中压缩成一个文件夹内容,按键触发事件
private void button4_Click(object sender, EventArgs e) { //测试用例 string PathandTitles = @"undefined,/Accessary/2018/03/3ab2d7b3-7c13-42ce-be20-afda96718a6f.xls|成本管理.xls,/Accessary/2018/03/b6b91639-7621-4f1a-b57a-e6e66a57a58a.xls|项目采购总计划表(新).xls"; PathandTitles = PathandTitles.Replace("/", "\\"); string[] PathandTitle = PathandTitles.Split(','); string[] Paths = new string[PathandTitle.Length - 1]; string[] Titles = new string[PathandTitle.Length - 1]; for (int i = 0; i < PathandTitle.Length - 1; i++) { Paths[i] = PathandTitle[i + 1].Split('|')[0]; Titles[i] = PathandTitle[i + 1].Split('|')[1]; } ZipClass Zc = new ZipClass(); Zc.CopyFiles(Paths, Titles, @"D:\鸿荣源开发\鸿荣源采购\Platform.Web\IDWebSoft", @"C:\Users\ZhongJinYuan\Desktop\上传", "批量下载测试", 6); MessageBox.Show("批量下载成功!"); }CopyFiles文件集中进行压缩的方法
/// <summary> /// 复制文件到一个目的文件夹下面 /// </summary> /// <param name="sourceFilesPath">需要复制的文件路径数组</param> /// <param name="sourceFilesTitle">需要复制的文件标题数组</param> /// <param name="strSourceFilePath">需要复制的文件物理路径</param> /// <param name="strGoalFilePath">文件复制至文件夹的物理路径</param> /// <param name="strGoalFileName">文件复制至文件夹的文件夹名称</param> /// <param name="CompressionLevel">压缩率</param> public void CopyFiles(string[] sourceFilesPath, string[] sourceFilesTitle,string strSourceFilePath, string strGoalFilePath, string strGoalFileName, int CompressionLevel) { //判断需要复制的文件是否存在 for (int i = 0; i < sourceFilesPath.Length; i++) { //如果文件没有找到,则报错 if (!System.IO.File.Exists(strSourceFilePath + sourceFilesPath[i])) { throw new System.IO.FileNotFoundException("文件:" + sourceFilesTitle[i] + "没有找到!"); } } // 创建目的文件夹 if (!Directory.Exists(strGoalFilePath + "\\" + strGoalFileName)) { Directory.CreateDirectory(strGoalFilePath + "\\" + strGoalFileName); } else { Directory.Delete(strGoalFilePath + "\\" + strGoalFileName, true); Directory.CreateDirectory(strGoalFilePath + "\\" + strGoalFileName); } //文件复制并重命名 for (int j = 0; j < sourceFilesPath.Length; j++) { File.Copy(strSourceFilePath + sourceFilesPath[j], strGoalFilePath + "\\" + strGoalFileName + "\\" + sourceFilesTitle[j]); } //调用上面的文件夹压缩 ZipDir(strGoalFilePath + "\\" + strGoalFileName, "", CompressionLevel); }
总结:
以上就是C#进行文件的压缩解压代码,应该说还是比较完整的,如果你们也刚好有类似的压缩,解压文件的需求,可以参考一下这篇文章的实现方式。