类别:程序开发
日期:2020-05-01 浏览:2195 评论:0
1、第一种压缩和解压方法:
/// <summary> /// 解压RAR和ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe)) /// </summary> /// <param name="UnPath">解压后文件保存目录</param> /// <param name="rarPathName">待解压文件存放绝对路径(包括文件名称)</param> /// <param name="IsCover">所解压的文件是否会覆盖已存在的文件(如果不覆盖,所解压出的文件和已存在的相同名称文件不会共同存在,只保留原已存在文件)</param> /// <param name="PassWord">解压密码(如果不需要密码则为空)</param> /// <returns>true(解压成功);false(解压失败)</returns> public static bool UnRarOrZip(string UnPath, string rarPathName, bool IsCover, string PassWord) { if (!Directory.Exists(UnPath)) Directory.CreateDirectory(UnPath); Process Process1 = new Process(); Process1.StartInfo.FileName = "Winrar.exe"; Process1.StartInfo.CreateNoWindow = true; string cmd = ""; if (!string.IsNullOrEmpty(PassWord) && IsCover) //解压加密文件且覆盖已存在文件( -p密码 ) cmd = string.Format(" x -p{0} -o+ {1} {2} -y", PassWord, rarPathName, UnPath); else if (!string.IsNullOrEmpty(PassWord) && !IsCover) //解压加密文件且不覆盖已存在文件( -p密码 ) cmd = string.Format(" x -p{0} -o- {1} {2} -y", PassWord, rarPathName, UnPath); else if (IsCover) //覆盖命令( x -o+ 代表覆盖已存在的文件) cmd = string.Format(" x -o+ {0} {1} -y", rarPathName, UnPath); else //不覆盖命令( x -o- 代表不覆盖已存在的文件) cmd = string.Format(" x -o- {0} {1} -y", rarPathName, UnPath); //命令 Process1.StartInfo.Arguments = cmd; Process1.Start(); Process1.WaitForExit();//无限期等待进程 winrar.exe 退出 //Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行 if (Process1.ExitCode == 0) { Process1.Close(); return true; } else { Process1.Close(); return false; } } /// <summary> /// 压缩文件成RAR或ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe)) /// </summary> /// <param name="filesPath">将要压缩的文件夹或文件的绝对路径</param> /// <param name="rarPathName">压缩后的压缩文件保存绝对路径(包括文件名称)</param> /// <param name="IsCover">所压缩文件是否会覆盖已有的压缩文件(如果不覆盖,所压缩文件和已存在的相同名称的压缩文件不会共同存在,只保留原已存在压缩文件)</param> /// <param name="PassWord">压缩密码(如果不需要密码则为空)</param> /// <returns>true(压缩成功);false(压缩失败)</returns> public static bool CondenseRarOrZip(string filesPath, string rarPathName, bool IsCover, string PassWord) { string rarPath = Path.GetDirectoryName(rarPathName); if (!Directory.Exists(rarPath)) Directory.CreateDirectory(rarPath); Process Process1 = new Process(); Process1.StartInfo.FileName = "Winrar.exe"; Process1.StartInfo.CreateNoWindow = true; string cmd = ""; if (!string.IsNullOrEmpty(PassWord) && IsCover) //压缩加密文件且覆盖已存在压缩文件( -p密码 -o+覆盖 ) cmd = string.Format(" a -ep1 -p{0} -o+ {1} {2} -r", PassWord, rarPathName, filesPath); else if (!string.IsNullOrEmpty(PassWord) && !IsCover) //压缩加密文件且不覆盖已存在压缩文件( -p密码 -o-不覆盖 ) cmd = string.Format(" a -ep1 -p{0} -o- {1} {2} -r", PassWord, rarPathName, filesPath); else if (string.IsNullOrEmpty(PassWord) && IsCover) //压缩且覆盖已存在压缩文件( -o+覆盖 ) cmd = string.Format(" a -ep1 -o+ {0} {1} -r", rarPathName, filesPath); else //压缩且不覆盖已存在压缩文件( -o-不覆盖 ) cmd = string.Format(" a -ep1 -o- {0} {1} -r", rarPathName, filesPath); //命令 Process1.StartInfo.Arguments = cmd; Process1.Start(); Process1.WaitForExit();//无限期等待进程 winrar.exe 退出 //Process1.ExitCode==0指正常执行,Process1.ExitCode==1则指不正常执行 if (Process1.ExitCode == 0) { Process1.Close(); return true; } else { Process1.Close(); return false; } }
第二种方式:.Net 中的压缩解压类 WindowsBase.dll
public class FileZip { /// <summary> /// 压缩文件夹 /// </summary> /// <param name="folderName"></param> /// <param name="compressedFileName"></param> /// <param name="overrideExisting"></param> /// <returns></returns> public 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> /// 压缩单个文件 /// </summary> /// <param name="fileName"></param> /// <param name="compressedFileName"></param> /// <param name="overrideExisting"></param> /// <returns></returns> public 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; } /// <summary> /// 解压缩 /// </summary> /// <param name="folderName"></param> /// <param name="compressedFileName"></param> /// <param name="overrideExisting"></param> /// <returns></returns> public 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; } private 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); } } }
本文标题:C# 如何解压和压缩文件的方法?
本文链接:https://vtzw.com/post/174.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。
发表评论 / 取消回复