标签:
/// <summary> /// 压缩文件帮助类 /// </summary> public class ZipHelper { /// <summary> /// 压缩文件 /// </summary> /// <param name="strFile">源文件夹</param> /// <param name="strZip">目标文件</param> public void ZipFiles(string strFile, string strZip) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar; ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression zip(strFile, s, strZip); s.Finish(); s.Close(); } /// <summary> /// 压缩多个文件到压缩文件 /// </summary> /// <param name="strFile">文件列表</param> /// <param name="strZip"></param> public void ZipFiles(string[] strFiles, string strZip) { ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression s.Password = "@isino"; foreach (string file in strFiles) { FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = file.Substring(file.LastIndexOf("\\") + 1); ZipEntry entry = new ZipEntry(tempfile); s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } s.Finish(); s.Close(); } /// <summary> /// 压缩文件 /// </summary> /// <param name="strFileName">源文件名</param> /// <param name="strZip">目标文件名</param> public void ZipFile(string strFileName, string strZip) { ZipOutputStream s = new ZipOutputStream(File.Create(strZip)); s.SetLevel(6); // 0 - store only to 9 - means best compression FileStream fs = File.OpenRead(strFileName); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = strFileName.Substring(strFileName.LastIndexOf("\\") + 1); ZipEntry entry = new ZipEntry(tempfile); Crc32 crc = new Crc32(); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); s.Finish(); s.Close(); } private void zip(string strFile, ZipOutputStream s, string staticFile) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar; Crc32 crc = new Crc32(); string[] filenames = Directory.GetFileSystemEntries(strFile); foreach (string file in filenames) { if (Directory.Exists(file)) { zip(file, s, staticFile); } else // 否则直接压缩文件 { //打开压缩文件 FileStream fs = File.OpenRead(file); byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); string tempfile = file.Substring(staticFile.LastIndexOf("\\") + 1); ZipEntry entry = new ZipEntry(tempfile); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; s.PutNextEntry(entry); s.Write(buffer, 0, buffer.Length); } } } public string unZipFile(string TargetFile, string fileDir) { string rootFile = " "; try { //读取压缩文件(zip文件),准备解压缩 ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim())); ZipEntry theEntry; string path = fileDir; //解压出来的文件保存的路径 string rootDir = " "; //根目录下的第一个子文件夹的名称 while ((theEntry = s.GetNextEntry()) != null) { rootDir = Path.GetDirectoryName(theEntry.Name); //得到根目录下的第一级子文件夹的名称 if (rootDir.IndexOf("\\") >= 0) { rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1); } string dir = Path.GetDirectoryName(theEntry.Name); //根目录下的第一级子文件夹的下的文件夹的名称 string fileName = Path.GetFileName(theEntry.Name); //根目录下的文件名称 if (dir != " ") //创建根目录下的子文件夹,不限制级别 { if (!Directory.Exists(fileDir + "\\" + dir)) { path = fileDir + "\\" + dir; //在指定的路径创建文件夹 Directory.CreateDirectory(path); } } else if (dir == " " && fileName != "") //根目录下的文件 { path = fileDir; rootFile = fileName; } else if (dir != " " && fileName != "") //根目录下的第一级子文件夹下的文件 { if (dir.IndexOf("\\") > 0) //指定文件保存的路径 { path = fileDir + "\\" + dir; } } if (dir == rootDir) //判断是不是需要保存在根目录下的文件 { path = fileDir + "\\" + rootDir; } //以下为解压缩zip文件的基本步骤 //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。 if (fileName != String.Empty) { FileStream streamWriter = File.Create(path + "\\" + fileName); 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; } } streamWriter.Close(); } } s.Close(); return rootFile; } catch (Exception ex) { return "1; " + ex.Message; } } /// <summary> /// 压缩文件 /// </summary> /// <param name="sourceFilesPaths">要压缩的文件路径列表</param> /// <param name="compressFileSavePath">压缩文件存放路径</param> /// <param name="compressFileName">压缩文件名(全名)</param> public void CompressFileForReportTable(ArrayList sourceFilesPaths, string compressFileSavePath, string compressFileName) { String the_rar; RegistryKey the_Reg; System.Object the_Obj; String the_Info; ProcessStartInfo the_StartInfo; Process the_Process; try { //使用注册表对象获取到WiNRar路径 the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command"); the_Obj = the_Reg.GetValue(""); the_rar = the_Obj.ToString(); the_Reg.Close(); the_rar = the_rar.Substring(1, the_rar.Length - 7); the_Info = " a " + compressFileName; foreach (object filePath in sourceFilesPaths) { the_Info += " " + filePath.ToString();//每个文件路径要与其它的空格隔开 } the_StartInfo = new ProcessStartInfo(); the_StartInfo.FileName = the_rar; the_StartInfo.Arguments = the_Info; the_StartInfo.WindowStyle = ProcessWindowStyle.Normal;//Hidden 隐藏样式 the_StartInfo.WorkingDirectory = compressFileSavePath;//获取或设置要启动的进程的初始目录。(RAR存放路径) the_Process = new Process(); the_Process.StartInfo = the_StartInfo; the_Process.Start(); } catch (Exception ex) { } } /// <summary> /// 解压缩指定的rar文件。 /// </summary> /// <param name="rarFileToDecompress">rar文件(绝对路径)。</param> /// <param name="directoryToSave">解压缩保存的目录。</param> /// <param name="deleteRarFile">解压缩后删除rar文件。</param> public void DecompressRAR(string rarFileToDecompress, string directoryToSave, bool deleteRarFile) { String the_rar; RegistryKey the_Reg; Object the_Obj; the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command"); the_Obj = the_Reg.GetValue(""); the_rar = the_Obj.ToString(); the_Reg.Close(); the_rar = the_rar.Substring(1, the_rar.Length - 7); string winrarExe = the_rar;//需要在指定路径下放入winara.exe的可执行文件在安装目录下可以找到这个文件 if (new FileInfo(winrarExe).Exists) { //directoryToSave = CheckDirectoryName(directoryToSave); try { Process p = new Process(); // 需要启动的程序名 p.StartInfo.FileName = winrarExe; // 参数 string arguments = @"x -inul -y -o+"; arguments += " " + rarFileToDecompress + " " + directoryToSave; p.StartInfo.Arguments = arguments; p.Start();//启动 while (!p.HasExited) { } p.WaitForExit(); } catch (Exception ee) { throw new Exception("压缩文件在解压缩的过程中出现了错误!"); } if (deleteRarFile) { File.Delete(rarFileToDecompress); } } else { throw new Exception("本机上缺少必须的Winrar.exe文件,不能完成相应操作请联系管理员安装WinRar解压工具!"); } } }
标签:
原文地址:http://www.cnblogs.com/tianxiaziwei/p/5653349.html