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 ...
随机推荐
- Python 元类使用讲解
我要一大群的类都具有一种特点,我怎么给他们加上呢?模板嘛,我从这个模板创建一群类不就OK了?那就需要元类了. 定义一个元类(就是一个类的模板!莫多想,还要记住这是类级别的,不是对象级别的!):代码如下 ...
- mysql sum()函数 , 计算总和
mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...
- React_03_ECMAScript6
1.ES6解构赋值 1.1.解构赋值概述 解构赋值是对赋值运算符的扩展. 它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值.在代码书写上简洁且易读,语义更加清晰明了:也方便了复杂对象中数 ...
- 多语言编程必备的十大 Vim 插件
原文地址:http://www.linuxeden.com/a/58769 使用这 10 个 Vim 插件,可以让你在写代码或运维时,感觉更棒. 我使用 Vim 文本编辑器大约 20 年了.有一段时间 ...
- OpenFOAM——具有压差的平行平板间流动(泊肃叶流动)
本算例翻译整理自:http://the-foam-house5.webnode.es/products/chapter-1-plane-parallel-plates-case/ 这个算例中两平板间没 ...
- 【NQG】Paragraph-level Neural Question Generation with Maxout Pointer and Gated Self-attention Networks论文笔记
这篇文章主要处理了在问题生成(Question Generation,QG)中,长文本(多为段落)在seq2seq模型中表现不佳的问题.长文本在生成高质量问题方面不可或缺. 1. Introducti ...
- 第07组 Alpha事后诸葛亮
1.请在博客开头给出组长博客链接(3.1 2分) 团队:摇光 队长:杨明哲 组长博客:这里 2.参考邹欣老师的问题模板进行总结思考(3.2 27分) 设想和目标(2分) 1.我们的软件要解决什么问题? ...
- 第07组 Alpha冲刺(4/6)
队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:摇光测评的相关功能. 展示GitHub当日代码/文档签入记录:(组内共用,已询问过助教 ...
- MacOS Laravel 安装教程
一.到官网选择 Laravel 版本 根据个人的喜好选择安装的版本,我选择的是 5.8 https://laravel.com/docs/5.8/installation 以下是 Laravel 5. ...
- electron---项目打包
创建一个应用目录:app,里面需要有必要的三个文件: index.html <!DOCTYPE html> <html> <head> <meta chars ...