using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SevenZip
{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public sealed class SevenZipUtil
{
///
/// 压缩单文件夹中指定类型的文件
///
/// 源文件目录
/// 要输出的压缩文件
/// 文件类型(*.txt等)
/// 压缩完后是否删除原文件
public static void ZipLargeFiles(string sourceFolder, string outZipFile, string filter = "*", bool delSrcFiles = true)
{
string cmdFormat;
if (delSrcFiles)
cmdFormat = "{0} a {1} {2} -sdel";
else
cmdFormat = "{0} a {1} {2}";
ZipUsing7zip(cmdFormat, sourceFolder, outZipFile, new string[] { filter });
if (delSrcFiles)
{
var files = Directory.GetFiles(sourceFolder);
foreach (var file in files)
{
if (file.ToUpper().EndsWith(filter.Replace("*", "").ToUpper()))
{
File.Delete(file);
}
}
}
}
///
/// 压缩单文件夹中指定类型的文件
///
/// 源文件目录
/// 要输出的压缩文件
/// 文件类型(*.txt等)
/// 压缩完后是否删除原文件
public static void ZipLargeFiles(string sourceFolder, string outZipFile, string[] filters, bool delSrcFiles = true)
{
string cmdFormat;
if (delSrcFiles)
cmdFormat = "a {0} {1} -sdel";
else
cmdFormat = "a {0} {1}";
ZipUsing7zip(cmdFormat, sourceFolder, outZipFile, filters);
if (delSrcFiles)
{
var files = Directory.GetFiles(sourceFolder);
foreach (var file in files)
{
if (EndsWith(file, filters))
{
File.Delete(file);
}
}
}
}
///
/// 解压指定的文件到压缩文件所在目录(返回目录路径)
///
///
///
public static string UnZipFile(string file,string filter="*")
{
try
{
string errorMsg = "";
string outputMsg = "";
string dir = Path.GetDirectoryName(file);
bool cmdResult = ExecuteCmdCommand($"e {file} -o{dir} -y {filter}", ref errorMsg, ref outputMsg);
if (!cmdResult)
{
string exceptionMsg = $"解压文件{file}时发生错误";
if (!string.IsNullOrWhiteSpace(errorMsg)) exceptionMsg = string.Format("{0} [{1}]", exceptionMsg, errorMsg);
throw new Exception(exceptionMsg);
}
return dir;
}
catch (Exception ex)
{
throw new Exception($"解压文件{file}时发生错误", ex);
}
}
#region private
private static bool ExecuteCmdCommand(string commandLine, ref string errorMsg, ref string outputMsg)
{
bool Flag = false;
Process proc = new Process();
try
{
// 配置CMD窗口的启动信息
proc.StartInfo.FileName = "7z";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.Arguments = commandLine;
proc.StartInfo.RedirectStandardOutput = true; // 开启重定向输出
proc.StartInfo.RedirectStandardError = true;// 开启重定向错误输出
proc.StartInfo.CreateNoWindow = true;
// 不创建窗口
proc.Start();
proc.WaitForExit();
errorMsg = proc.StandardError.ReadToEnd();
outputMsg = proc.StandardOutput.ReadToEnd();
if (string.IsNullOrWhiteSpace(errorMsg))
Flag = true;
else
Flag = false;
}
catch (Exception ex)
{
errorMsg = ex.Message;
Flag = false;
}
finally
{
proc.Close();
proc.Dispose();
}
return Flag;
}
private static bool EndsWith(string txt, string[] filters)
{
foreach (var filter in filters)
{
if (txt.ToUpper().EndsWith(filter.Replace("*", "").ToUpper()))
return true;
}
return false;
}
private static void ZipUsing7zip(string cmdFormat, string sourceFolder, string outZipFile, string[] filters)
{
try
{
// 获取要压缩的文件
string filesPath = string.Join(" ", filters.Select(p => Path.Combine(sourceFolder, p)));
// 格式化命令
string cmd = string.Format(cmdFormat, outZipFile, filesPath);
// 调用 7-Zip 执行命令
string errorMsg = "";
string outputMsg = "";
bool cmdResult = ExecuteCmdCommand(cmd, ref errorMsg, ref outputMsg);
if (!cmdResult)
{
string exceptionMsg = "压缩文件时发生错误";
if (!string.IsNullOrWhiteSpace(errorMsg)) exceptionMsg = string.Format("{0} [{1}]", exceptionMsg, errorMsg);
throw new Exception(exceptionMsg);
}
}
catch (Exception ex)
{
throw new Exception("压缩文件时发生错误", ex);
}
}
#endregion
}
}