软件压缩包后缀改成什么(免费文件压缩软件推荐)

关于本文档的说明   本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 1.基本介绍 由于项目中需要用到各种压缩将文件进行...

关于本文档的说明

  本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的

1.基本介绍

由于项目中需要用到各种压缩将文件进行压缩下载,减少网络的带宽,所以压缩是一个非常常见的功能,对于压缩微软自己也提供了一些类库

微软自带压缩类ZipArchive类,适合NET FrameWork4.5才可以使用调用压缩软件命令执行压缩动作,这个就需要电脑本身安装压缩软件了使用第三方的压缩dll文件,一般使用最多的是(ICSharpCode.SharpZipLib.dll),下载dll ICSharpCode.SharpZipLib.zip

2.实际项目

压缩单个文件,需要指定压缩等级压缩单个文件夹,需要指定压缩等级压缩多个文件或者多个文件夹对压缩包进行加密【用的比较少,实际情况也有】直接解压,无需密码需要密码解压

2.1 压缩单个文件

ZipHelper 压缩和解压帮助类

写了两个方法,可以指定压缩等级,这样你的压缩包大小就不一样了

2.2 压缩单个文件夹

public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)

2.3 压缩多个文件或者文件夹

1

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)

2.4 对压缩包进行加密

1

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)

2.5 直接解压,无需密码

1

public void UnZip(string zipFilePath, string unZipDir)

3.演示图

ZipHelper 压缩和解压帮助类

3.ZipHelper下载

//-------------------------------------------------------------------------------------

// All Rights Reserved , Copyright (C) 2016 , ZTO , Ltd .

//-------------------------------------------------------------------------------------

using System;

using System.Collections;

using System.Collections.Generic;

using System.IO;

namespace ZTO.PicTest.Utilities

{

using ICSharpCode.SharpZipLib.Checksums;

using ICSharpCode.SharpZipLib.Zip;

/// <summary>

/// Zip压缩帮助类

///

/// 修改纪录

///

/// 2015-09-16 版本:1.0 YangHengLian 创建主键,注意命名空间的排序。

/// 2016-5-7 YangHengLian增加了可以支持多个文件或者多个文件夹打包成一个zip文件

///

/// 版本:1.0

///

/// <author>

/// <name>YangHengLian</name>

/// <date>2015-09-16</date>

/// </author>

/// </summary>

public class ZipHelper

{

/// <summary>

/// 压缩文件夹

/// </summary>

/// <param name="dirToZip"></param>

/// <param name="zipedFileName"></param>

/// <param name="compressionLevel">压缩率0(无压缩)9(压缩率最高)</param>

public void ZipDir(string dirToZip, string zipedFileName, int compressionLevel = 9)

{

if (Path.GetExtension(zipedFileName) != ".zip")

{

zipedFileName = zipedFileName + ".zip";

}

using (var zipoutputstream = new ZipOutputStream(File.Create(zipedFileName)))

{

zipoutputstream.SetLevel(compressionLevel);

Crc32 crc = new Crc32();

Hashtable fileList = GetAllFies(dirToZip);

foreach (DictionaryEntry item in fileList)

{

FileStream fs = new FileStream(item.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

byte[] buffer = new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

// ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(dirToZip.Length + 1));

ZipEntry entry = new ZipEntry(Path.GetFileName(item.Key.ToString()))

{

DateTime = (DateTime) item.Value,

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>

public Hashtable GetAllFies(string dir)

{

Hashtable filesList = new Hashtable();

DirectoryInfo fileDire = new DirectoryInfo(dir);

if (!fileDire.Exists)

{

throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");

}

GetAllDirFiles(fileDire, filesList);

GetAllDirsFiles(fileDire.GetDirectories(), filesList);

return filesList;

}

/// <summary>

/// 获取一个文件夹下的所有文件夹里的文件

/// </summary>

/// <param name="dirs"></param>

/// <param name="filesList"></param>

public void GetAllDirsFiles(IEnumerable<DirectoryInfo> dirs, Hashtable 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>

public static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList)

{

foreach (FileInfo file in dir.GetFiles("*.*"))

{

filesList.Add(file.FullName, file.LastWriteTime);

}

}

/// <summary>

/// 功能:解压zip格式的文件。

/// </summary>

/// <param name="zipFilePath">压缩文件路径</param>

/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>

/// <returns>解压是否成功</returns>

public void UnZip(string zipFilePath, string unZipDir)

{

if (zipFilePath == string.Empty)

{

throw new Exception("压缩文件不能为空!");

}

if (!File.Exists(zipFilePath))

{

throw new 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 (var 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 (!string.IsNullOrEmpty(directoryName))

{

Directory.CreateDirectory(unZipDir + directoryName);

}

if (directoryName != null && !directoryName.EndsWith("/"))

{

}

if (fileName != String.Empty)

{

using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))

{

int size;

byte[] data = new byte[2048];

while (true)

{

size = s.Read(data, 0, data.Length);

if (size > 0)

{

streamWriter.Write(data, 0, size);

}

else

{

break;

}

}

}

}

}

}

}

/// <summary>

/// 压缩单个文件

/// </summary>

/// <param name="filePath">被压缩的文件名称(包含文件路径),文件的全路径</param>

/// <param name="zipedFileName">压缩后的文件名称(包含文件路径),保存的文件名称</param>

/// <param name="compressionLevel">压缩率0(无压缩)到 9(压缩率最高)</param>

public void ZipFile(string filePath, string zipedFileName, int compressionLevel = 9)

{

// 如果文件没有找到,则报错

if (!File.Exists(filePath))

{

throw new FileNotFoundException("文件:" + filePath + "没有找到!");

}

// 如果压缩后名字为空就默认使用源文件名称作为压缩文件名称

if (string.IsNullOrEmpty(zipedFileName))

{

string oldValue = Path.GetFileName(filePath);

if (oldValue != null)

{

zipedFileName = filePath.Replace(oldValue, "") + Path.GetFileNameWithoutExtension(filePath) + ".zip";

}

}

// 如果压缩后的文件名称后缀名不是zip,就是加上zip,防止是一个乱码文件

if (Path.GetExtension(zipedFileName) != ".zip")

{

zipedFileName = zipedFileName + ".zip";

}

// 如果指定位置目录不存在,创建该目录 C:\Users\yhl\Desktop\大汉三通

string zipedDir = zipedFileName.Substring(0, zipedFileName.LastIndexOf("\\", StringComparison.Ordinal));

if (!Directory.Exists(zipedDir))

{

Directory.CreateDirectory(zipedDir);

}

// 被压缩文件名称

string filename = filePath.Substring(filePath.LastIndexOf("\\", StringComparison.Ordinal) + 1);

var streamToZip = new FileStream(filePath, FileMode.Open, FileAccess.Read);

var zipFile = File.Create(zipedFileName);

var zipStream = new ZipOutputStream(zipFile);

var zipEntry = new ZipEntry(filename);

zipStream.PutNextEntry(zipEntry);

zipStream.SetLevel(compressionLevel);

var buffer = new byte[2048];

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;

}

}

finally

{

zipStream.Finish();

zipStream.Close();

streamToZip.Close();

}

}

/// <summary>

/// 压缩单个文件

/// </summary>

/// <param name="fileToZip">要进行压缩的文件名,全路径</param>

/// <param name="zipedFile">压缩后生成的压缩文件名,全路径</param>

public void ZipFile(string fileToZip, string zipedFile)

{

// 如果文件没有找到,则报错

if (!File.Exists(fileToZip))

{

throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");

}

using (FileStream fileStream = File.OpenRead(fileToZip))

{

byte[] buffer = new byte[fileStream.Length];

fileStream.Read(buffer, 0, buffer.Length);

fileStream.Close();

using (FileStream zipFile = File.Create(zipedFile))

{

using (ZipOutputStream zipOutputStream = new ZipOutputStream(zipFile))

{

// string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);

string fileName = Path.GetFileName(fileToZip);

var zipEntry = new ZipEntry(fileName)

{

DateTime = DateTime.Now,

IsUnicodeText = true

};

zipOutputStream.PutNextEntry(zipEntry);

zipOutputStream.SetLevel(5);

zipOutputStream.Write(buffer, 0, buffer.Length);

zipOutputStream.Finish();

zipOutputStream.Close();

}

}

}

}

/// <summary>

/// 压缩多个目录或文件

/// </summary>

/// <param name="folderOrFileList">待压缩的文件夹或者文件,全路径格式,是一个集合</param>

/// <param name="zipedFile">压缩后的文件名,全路径格式</param>

/// <param name="password">压宿密码</param>

/// <returns></returns>

public bool ZipManyFilesOrDictorys(IEnumerable<string> folderOrFileList, string zipedFile, string password)

{

bool res = true;

using (var s = new ZipOutputStream(File.Create(zipedFile)))

{

s.SetLevel(6);

if (!string.IsNullOrEmpty(password))

{

s.Password = password;

}

foreach (string fileOrDir in folderOrFileList)

{

//是文件夹

if (Directory.Exists(fileOrDir))

{

res = ZipFileDictory(fileOrDir, s, "");

}

else

{

//文件

res = ZipFileWithStream(fileOrDir, s);

}

}

s.Finish();

s.Close();

return res;

}

}

/// <summary>

/// 带压缩流压缩单个文件

/// </summary>

/// <param name="fileToZip">要进行压缩的文件名</param>

/// <param name="zipStream"></param>

/// <returns></returns>

private bool ZipFileWithStream(string fileToZip, ZipOutputStream zipStream)

{

//如果文件没有找到,则报错

if (!File.Exists(fileToZip))

{

throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");

}

//FileStream fs = null;

FileStream zipFile = null;

ZipEntry zipEntry = null;

bool res = true;

try

{

zipFile = File.OpenRead(fileToZip);

byte[] buffer = new byte[zipFile.Length];

zipFile.Read(buffer, 0, buffer.Length);

zipFile.Close();

zipEntry = new ZipEntry(Path.GetFileName(fileToZip));

zipStream.PutNextEntry(zipEntry);

zipStream.Write(buffer, 0, buffer.Length);

}

catch

{

res = false;

}

finally

{

if (zipEntry != null)

{

}

if (zipFile != null)

{

zipFile.Close();

}

GC.Collect();

GC.Collect(1);

}

return res;

}

/// <summary>

/// 递归压缩文件夹方法

/// </summary>

/// <param name="folderToZip"></param>

/// <param name="s"></param>

/// <param name="parentFolderName"></param>

private bool ZipFileDictory(string folderToZip, ZipOutputStream s, string parentFolderName)

{

bool res = true;

ZipEntry entry = null;

FileStream fs = null;

Crc32 crc = new Crc32();

try

{

//创建当前文件夹

entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")); //加上 “/” 才会当成是文件夹创建

s.PutNextEntry(entry);

s.Flush();

//先压缩文件,再递归压缩文件夹

var filenames = Directory.GetFiles(folderToZip);

foreach (string file in filenames)

{

//打开压缩文件

fs = File.OpenRead(file);

byte[] buffer = new byte[fs.Length];

fs.Read(buffer, 0, buffer.Length);

entry = new ZipEntry(Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/" + Path.GetFileName(file)));

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);

}

}

catch

{

res = false;

}

finally

{

if (fs != null)

{

fs.Close();

}

if (entry != null)

{

}

GC.Collect();

GC.Collect(1);

}

var folders = Directory.GetDirectories(folderToZip);

foreach (string folder in folders)

{

if (!ZipFileDictory(folder, s, Path.Combine(parentFolderName, Path.GetFileName(folderToZip))))

{

return false;

}

}

return res;

}

}

}

  • 发表于 2022-05-04 18:47
  • 阅读 ( 224 )
  • 分类:互联网

0 条评论

请先 登录 后评论
guanxi16
guanxi16

681 篇文章

你可能感兴趣的文章

相关问题