C#解压、压缩高级用法
压缩:(可以吧要排除的文件去掉)
/// <summary>
/// 压缩文件夹
/// </summary>
/// <param name="folder"></param>
/// <param name="zipedFileName"></param>
/// <param name="compressionLevel">压缩率0(无压缩)9(压缩率最高)</param>
public static void ZipDir(string zipedFileName, string folder, string dirEntryPrefix = null, string excludePathReg = null, int compressionLevel = 4)
{
if (Path.GetExtension(zipedFileName) != ".zip")
{
zipedFileName = zipedFileName + ".zip";
}
ZipDir(zipedFileName, new string[] { folder }, new string[] { dirEntryPrefix }, new string[] { excludePathReg }, compressionLevel);
} public static void ZipDir(string zipedFileName, string[] folders, string[] dirEntryPrefixs = null, string[] excludePathRegs = null, int compressionLevel = 4)
{
if (Path.GetExtension(zipedFileName) != ".zip")
{
zipedFileName = zipedFileName + ".zip";
}
if (string.IsNullOrEmpty(zipedFileName) || folders == null) return; if (dirEntryPrefixs != null && folders.Length != dirEntryPrefixs.Length)
throw new Exception("数组个数不一致");
if (excludePathRegs != null && folders.Length != excludePathRegs.Length)
throw new Exception("数组个数不一致"); FileUtils.CreateDirectoryIfNotExists(Path.GetDirectoryName(zipedFileName)); using (var zipoutputstream = new ZipOutputStream(File.Create(zipedFileName)))
{
zipoutputstream.SetLevel(compressionLevel);
Crc32 crc = new Crc32(); for (int i = 0; i < folders.Length; i++)
{
string folder = folders[i];
folder = Path.GetFullPath(folder); //先将文件夹名称标准化 string excludePathReg = null;
if (excludePathRegs != null) excludePathReg = excludePathRegs[i];
string dirEntryPrefix = null;
if (dirEntryPrefixs != null) dirEntryPrefix = dirEntryPrefixs[i]; List<FileInfo> allFiles = GetAllFileEntries(folder, excludePathReg);
if (allFiles == null) continue; foreach (FileInfo fileInfo in allFiles)
{
//读取文件内容
//FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
//byte[] buffer = new byte[fs.Length];
//fs.Read(buffer, 0, buffer.Length);
//fs.Close();
byte[] buffer = File.ReadAllBytes(fileInfo.FullName); //生成路径
string entryPath;
if (File.Exists(folder)) entryPath = fileInfo.Name; //但如果“文件夹”本身就是独立的文件,则直接取文件名
else entryPath = fileInfo.FullName.Substring(folder.Length + 1); //全路径减去原文件夹的路径 if (!string.IsNullOrEmpty(dirEntryPrefix))
{
entryPath = Path.Combine(dirEntryPrefix, entryPath); //加上前缀
}
entryPath = entryPath.Replace('\\', '/'); ZipEntry entry = new ZipEntry(entryPath);
entry.DateTime = fileInfo.LastWriteTime;
entry.Size = fileInfo.Length; crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
zipoutputstream.PutNextEntry(entry);
zipoutputstream.Write(buffer, 0, buffer.Length);
}
}
}
} public static List<FileInfo> GetAllFileEntries(string folder, string excludePathReg = null)
{
if (string.IsNullOrEmpty(folder)) return null; if (File.Exists(folder)) //如果是文件,则直接返回该文件
{
return new List<FileInfo>() { new FileInfo(folder) };
}
//一般情况下是数组
DirectoryInfo dirInfo = new DirectoryInfo(folder);
if (!dirInfo.Exists) return null; List<FileInfo> result = new List<FileInfo>(); //先遍历下面所有的文件
foreach (FileInfo fileInfo in dirInfo.GetFiles())
{
string fileName = fileInfo.Name;
if (fileName == ".DS_Store" || fileName.StartsWith("._"))
continue; // mac系统下的系统文件直接忽略 if (!string.IsNullOrEmpty(excludePathReg))//排除一些
{
if (Regex.IsMatch(fileInfo.FullName, excludePathReg)) continue;
}
result.Add(fileInfo);
} //再递归遍历下面所有的子文件夹
foreach (DirectoryInfo subDir in dirInfo.GetDirectories())
{
result.AddRange(GetAllFileEntries(subDir.FullName, excludePathReg));
} return result;
}
解压:(可以对要解压的文件进行操作,转换在lambda中加方法中就行)
public static int UnZip(string zipFilePath, string unZipDir)
{
return UnZip(zipFilePath, unZipDir, false, null, null);
} public static int UnZipGGBforBook(string zipFilePath, string unZipDir)
{
return UnZip(zipFilePath, unZipDir, true, ConvertGGBtoBase64,
fileName => fileName.Replace(".ggb", ".js"));
} private static Stream ConvertGGBtoBase64(MemoryStream stream)
{
//将GGB内容转成base64
//stream.Seek(0, SeekOrigin.Begin);
//int len = (int)stream.Length;
//byte[] buffer = new byte[len];
//stream.Read(buffer, 0, len);
byte[] buffer = stream.ToArray(); string base64 = Convert.ToBase64String(buffer);
string content = "var 1111=\"" + base64 +"\";";
byte[] contentBytes = Encoding.UTF8.GetBytes(content);
//MemoryStream memory = new MemoryStream();
//memory.Write(contentBytes, 0, contentBytes.Length);
MemoryStream memory = new MemoryStream(contentBytes);
return memory;
} /// <summary>
/// 功能:解压zip格式的文件。
/// </summary>
/// <param name="zipFilePath">压缩文件路径</param>
/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
/// <param name="boolBase64">是否生成base64
/// <returns>解压是否成功</returns>
public static int UnZip(string zipFilePath, string unZipDir, bool ignoreTargetRootDir,
Func<MemoryStream,Stream> contentConverter, Func<string, string> fileNameConverter)
{
if (string.IsNullOrEmpty(zipFilePath))
return 0; if (!File.Exists(zipFilePath)) return 0; //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
if (unZipDir == string.Empty)
unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
if (!unZipDir.EndsWith("\\"))
unZipDir += "\\";
if (!Directory.Exists(unZipDir))
Directory.CreateDirectory(unZipDir); int fileCnt = 0; //解压的文件数(不含文件夹)
using (var sourceStream = new ZipInputStream(File.OpenRead(zipFilePath)))
{
ZipEntry entry;
while ((entry = sourceStream.GetNextEntry()) != null)
{
string name = entry.Name;
if (string.IsNullOrEmpty(name)) continue; name = name.Replace("/", "\\"); if (ignoreTargetRootDir)
{
name = name.Substring(name.IndexOf("\\") + 1); //去掉目标文件所带的根目录,如"书名"
}
if (string.IsNullOrEmpty(name)) continue; string targetName = unZipDir + name; //要放入的目标文件 //删除不在这个地方考虑
//if (targetName.EndsWith("geogebra\\"))//把原始文件下面的先删除
//{
// DeleteDirectory(targetName, null);
//} //string targetDir = Path.GetDirectoryName(targetName); //如果是文件夹,则创建文件夹
if (name.EndsWith("\\"))
{
Directory.CreateDirectory(targetName);
continue;
} //如果是文件,则输出到目标中 //文件名可能需要转换
if (fileNameConverter != null)
{
targetName = fileNameConverter(targetName);
if (string.IsNullOrEmpty(targetName)) continue; //如果得到的文件名为空,则不处理
} MemoryStream memoryStream = new MemoryStream();
sourceStream.CopyTo(memoryStream); //byte[] data = new byte[2048];
//while (true)
//{
// int size = sourceStream.Read(data, 0, data.Length);
// if (size == 0) break;
// memoryStream.Write(data, 0, size);
//}
//如果需要转换流
Stream convertedStream = memoryStream;
if (contentConverter != null)
{
convertedStream = contentConverter(memoryStream);
} FileStream targetStream = File.Create(targetName);
convertedStream.Seek(0, SeekOrigin.Begin);
convertedStream.CopyTo(targetStream);
targetStream.Close();
convertedStream.Close();
if (memoryStream != convertedStream) memoryStream.Close();
fileCnt++;
}
}
return fileCnt;
}
压缩排除文件夹的调用:
excludePathReg.Add("\\\\static\\\\katex\\\\.+");
排除的文件:
string excludeFileReg = "(\\.mp4|\\.avi|\\.rmvb|\\.divx|\\.asf|\\.rm|\\.mpg|\\.mpeg|\\.mpe|\\.wmv|\\.mkv|\\.vob|\\.txt|\\.bat|\\.TXT)$";//排除的文件
C#解压、压缩高级用法的更多相关文章
- Linux下tar-rar-unrar解压/压缩缩命令大全
转载请标明出处: http://www.cnblogs.com/why168888/p/5975559.html 本文出自:[Edwin博客园] RAR文件下载:http://www.rarlab.c ...
- linux解压/压缩文件
1.*.tar 用 tar –xvf 解压 2.*.gz 用 gzip -d或者gunzip 解压 3.*.tar.gz和*.tgz 用 tar –xzf 解压 4.*.bz2 用 bzip2 ...
- Mac terminal 解压压缩
tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gunz ...
- Linux zip解压/压缩并指定目录
方法如下: 压缩并指定目录举例:zip -r /home/kms/kms.zip /home/kms/server/kms 解压并指定目录 举例:unzip /home/kms/kms.zip -d ...
- Linux解压/压缩命令——tar、gz、tar.gz、tgz、bz2、tar.bz2、Z、zip、rar、lha
.tar 解包:tar -xvf FileName.tar 打包:tar -cvf FileName.tar DirName ——————————————— .gz 解压1:gunzip FileNa ...
- Linux 解压/压缩操作命令
.tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...
- C# .NET 使用第三方类库DotNetZip解压/压缩Zip rar文件
DotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码……总之感觉比SharpZipLib好用.而且DotNetZip支持VB, ...
- Qt 解压/压缩文件
很久没有在博客园写随笔了,今天项目需要解压和压缩文件,所以去了解哈. 参考的是大神的代码:https://yq.aliyun.com/articles/24428. 使用的是 QuaZIP类. 类 说 ...
- 解压unzip的用法
1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...
随机推荐
- c++ Size capacity Resize reserve shrink_to_fit
- 01-复杂度2 Maximum Subsequence Sum (25 分)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Ranger部署
一.Apache Ranger是什么? Apache Ranger是一个框架,Hadoop上对于保护数据数据安全性的安全框架.用于在整个Hadoop平台上启用,监视和管理全面的数据安全性. 二.特性 ...
- Fluent也弹窗
具体步骤见<fluent加载第三方(C++,Fortran等)动态链接库> 我们对导入的动态链接库进行改动 打开VS2013 源代码: #include #ifdef __cplusplu ...
- Android dump命令查看某个apk是被谁安装的?
adb shell dumpsys package packages > packageAll.txt ORadb shell pm dump packages > package ...
- 这42个Python小例子,太走心
告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 < ...
- Python - Django - form 组件基本用法
普通 form 表单的处理: reg.html: <!DOCTYPE html> <html lang="en"> <head> <met ...
- Docker 安装 redis 并实现配置文件启动,数据文件本地持久化
1,笔者使用的是 Linux 的 Centos7 版本 2,安装 Docker,不会安装可以移步 Docker 在 Linux 平台的安装 以及一些常见命令 3,下载 docker 镜像 3.1,首 ...
- springboot实战日记(一)数据库基本信息
摘要:基于spring boot的后端实现,开发一个微信小程序点餐系统,主要是写写思路和遇到的问题以及分享读到的好文章. 项目分析: 1.角色划分,就是开有什么人使用这个系统,买家(手机端),卖家(p ...