/// <summary>
/// 处理在解压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在文件
/// </summary>
/// <param name="filename">解压后文件</param>
/// <returns>是否替换已存在的文件,是将替换,否不替换</returns>
private bool _ProcessOverwrite(string filename)
{
bool isOverWrite = false;
ZipHelpEventArgs e = new ZipHelpEventArgs(filename, isOverWrite);
OnZipHelperProcessOverWrite(e);
return e.IsOverWrite;
}
/// <summary>
/// 处理在压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在的压缩文件
/// </summary>
/// <param name="e"></param>
private void _ProcessOverwrite(ZipHelpEventArgs e)
{
OnZipHelperProcessOverWrite(e);
}
#endregion
#region 静态方法
/// <summary>
/// 获取单个文件压缩后大小
/// </summary>
/// <param name="filename">要压缩的文件路径</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件大小(以字节为单位)</returns>
public static long GetFileCompressedSize(string fileName, string tempDir)
{
long rv = 0;
//以当前时间点为文件名,以防止文件冲突
string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");
//创建临时压缩文件
ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
try
{
FileInfo fi = new FileInfo(fileName);
ZipEntry entry = new ZipEntry(fi.Name);
FileStream sReader = File.OpenRead(fileName);
byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
sReader.Read(buff, 0, (int)sReader.Length);
entry.Size = sReader.Length;
sReader.Close();
entry.DateTime = fi.LastWriteTime;
zipOut.PutNextEntry(entry);
zipOut.Write(buff, 0, buff.Length);
zipOut.Finish();
zipOut.Close();
if (File.Exists(targetFile))
{
FileInfo fi2 = new FileInfo(targetFile);
rv = fi2.Length;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//删除临时文件
if (File.Exists(targetFile))
{
File.Delete(targetFile);
}
}
return rv;
}
/// <summary>
/// 获取某文件列表压缩后大小
/// </summary>
/// <param name="filename">要压缩的文件路径数组</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件大小(以字节为单位)</returns>
public static long GetFileCompressedSize(string[] fileList, string tempDir)
{
long rv = 0;
//以当前时间点为文件名,以防止文件冲突
string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");
//创建临时压缩文件
ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
try
{
foreach (string fName in fileList)
{
FileInfo fi = new FileInfo(fName);
ZipEntry entry = new ZipEntry(fi.Name);
FileStream sReader = File.OpenRead(fName);
byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
sReader.Read(buff, 0, (int)sReader.Length);
entry.Size = sReader.Length;
sReader.Close();
entry.DateTime = fi.LastWriteTime;
zipOut.PutNextEntry(entry);
zipOut.Write(buff, 0, buff.Length);
}
zipOut.Finish();
zipOut.Close();
if (File.Exists(targetFile))
{
FileInfo fi2 = new FileInfo(targetFile);
rv = fi2.Length;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//删除临时文件
if (File.Exists(targetFile))
{
File.Delete(targetFile);
}
}
return rv;
}
/// <summary>
/// 获取压缩文件里的文件列表
/// </summary>
/// <remarks>忽略压缩文件中的目录,只返回文件。</remarks>
/// <param name="filename">压缩文件路径</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件名数组</returns>
public static string[] GetFileList(string fileName, string tempDir)
{
FastZip fz = new FastZip();
fz.RestoreDateTimeOnExtract = true;
string[] rv;
//在当前程序路径/Temp 下创建临时目录
string tempdir = Path.Combine(tempDir, "tempzip");
try
{
fz.ExtractZip(fileName, tempdir, "");
rv = Directory.GetFiles(tempdir);
//删除临时文件
Directory.Delete(tempdir, true);
}
catch (Exception ex)
{
rv = null;
throw ex;
}
return rv;
}
/// <summary>
/// 抽取压缩文件里的某个文件
/// </summary>
/// <param name="ZipFileName">压缩文件路径</param>
/// <param name="zipFileName">压缩文件路径</param>
/// <param name="extraFileName">要抽取的文件名</param>
/// <param name="targetDir">抽取文件保存目录</param>
/// <param name="tempDir">临时目录</param>
public static bool GetFile(string zipFileName, string extraFileName, string targetDir, string tempDir)
{
bool rv = false;
FastZip fz = new FastZip();
fz.RestoreDateTimeOnExtract = true;
string targetFileName = "";
string[] tempfiles;
FileInfo fi;
//在当前程序路径/temp 下 创建临时目录
string tempdir = Path.Combine(tempDir, "tempzip");
try
{
fz.ExtractZip(zipFileName, tempdir, "");
tempfiles = Directory.GetFiles(tempdir);
foreach (string fname in tempfiles)
{
fi = new FileInfo(fname);
if (fi.Name.Equals(extraFileName))
{
targetFileName = Path.Combine(targetDir, fi.Name);
File.Move(fi.FullName, targetFileName);
break;
}
}
//删除临时目录
Directory.Delete(tempdir, true);
//检查目标文件是否已经创建
if (File.Exists(targetFileName))
rv = true;
else
rv = false;
}
catch (Exception ex)
{
rv = false;
throw ex;
}
return rv;
}
/// <summary>
/// 获取当前时间点,精确到毫秒
/// </summary>
/// <returns>时间点字符串</returns>
private static string _GetCurrDatetime()
{
DateTime dt = System.DateTime.Now;
string rv = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Second.ToString() + dt.Millisecond.ToString();
return rv;
}
#endregion
#endregion
}
}
/// 处理在解压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在文件
/// </summary>
/// <param name="filename">解压后文件</param>
/// <returns>是否替换已存在的文件,是将替换,否不替换</returns>
private bool _ProcessOverwrite(string filename)
{
bool isOverWrite = false;
ZipHelpEventArgs e = new ZipHelpEventArgs(filename, isOverWrite);
OnZipHelperProcessOverWrite(e);
return e.IsOverWrite;
}
/// <summary>
/// 处理在压缩时,如果在目标目录下已经存在相同的文件,提示用户是否替换已存在的压缩文件
/// </summary>
/// <param name="e"></param>
private void _ProcessOverwrite(ZipHelpEventArgs e)
{
OnZipHelperProcessOverWrite(e);
}
#endregion
#region 静态方法
/// <summary>
/// 获取单个文件压缩后大小
/// </summary>
/// <param name="filename">要压缩的文件路径</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件大小(以字节为单位)</returns>
public static long GetFileCompressedSize(string fileName, string tempDir)
{
long rv = 0;
//以当前时间点为文件名,以防止文件冲突
string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");
//创建临时压缩文件
ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
try
{
FileInfo fi = new FileInfo(fileName);
ZipEntry entry = new ZipEntry(fi.Name);
FileStream sReader = File.OpenRead(fileName);
byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
sReader.Read(buff, 0, (int)sReader.Length);
entry.Size = sReader.Length;
sReader.Close();
entry.DateTime = fi.LastWriteTime;
zipOut.PutNextEntry(entry);
zipOut.Write(buff, 0, buff.Length);
zipOut.Finish();
zipOut.Close();
if (File.Exists(targetFile))
{
FileInfo fi2 = new FileInfo(targetFile);
rv = fi2.Length;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//删除临时文件
if (File.Exists(targetFile))
{
File.Delete(targetFile);
}
}
return rv;
}
/// <summary>
/// 获取某文件列表压缩后大小
/// </summary>
/// <param name="filename">要压缩的文件路径数组</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件大小(以字节为单位)</returns>
public static long GetFileCompressedSize(string[] fileList, string tempDir)
{
long rv = 0;
//以当前时间点为文件名,以防止文件冲突
string targetFile = Path.Combine(tempDir, _GetCurrDatetime() + ".zip");
//创建临时压缩文件
ZipOutputStream zipOut = new ZipOutputStream(File.Create(targetFile));
try
{
foreach (string fName in fileList)
{
FileInfo fi = new FileInfo(fName);
ZipEntry entry = new ZipEntry(fi.Name);
FileStream sReader = File.OpenRead(fName);
byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
sReader.Read(buff, 0, (int)sReader.Length);
entry.Size = sReader.Length;
sReader.Close();
entry.DateTime = fi.LastWriteTime;
zipOut.PutNextEntry(entry);
zipOut.Write(buff, 0, buff.Length);
}
zipOut.Finish();
zipOut.Close();
if (File.Exists(targetFile))
{
FileInfo fi2 = new FileInfo(targetFile);
rv = fi2.Length;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//删除临时文件
if (File.Exists(targetFile))
{
File.Delete(targetFile);
}
}
return rv;
}
/// <summary>
/// 获取压缩文件里的文件列表
/// </summary>
/// <remarks>忽略压缩文件中的目录,只返回文件。</remarks>
/// <param name="filename">压缩文件路径</param>
/// <param name="tempDir">临时目录</param>
/// <returns>文件名数组</returns>
public static string[] GetFileList(string fileName, string tempDir)
{
FastZip fz = new FastZip();
fz.RestoreDateTimeOnExtract = true;
string[] rv;
//在当前程序路径/Temp 下创建临时目录
string tempdir = Path.Combine(tempDir, "tempzip");
try
{
fz.ExtractZip(fileName, tempdir, "");
rv = Directory.GetFiles(tempdir);
//删除临时文件
Directory.Delete(tempdir, true);
}
catch (Exception ex)
{
rv = null;
throw ex;
}
return rv;
}
/// <summary>
/// 抽取压缩文件里的某个文件
/// </summary>
/// <param name="ZipFileName">压缩文件路径</param>
/// <param name="zipFileName">压缩文件路径</param>
/// <param name="extraFileName">要抽取的文件名</param>
/// <param name="targetDir">抽取文件保存目录</param>
/// <param name="tempDir">临时目录</param>
public static bool GetFile(string zipFileName, string extraFileName, string targetDir, string tempDir)
{
bool rv = false;
FastZip fz = new FastZip();
fz.RestoreDateTimeOnExtract = true;
string targetFileName = "";
string[] tempfiles;
FileInfo fi;
//在当前程序路径/temp 下 创建临时目录
string tempdir = Path.Combine(tempDir, "tempzip");
try
{
fz.ExtractZip(zipFileName, tempdir, "");
tempfiles = Directory.GetFiles(tempdir);
foreach (string fname in tempfiles)
{
fi = new FileInfo(fname);
if (fi.Name.Equals(extraFileName))
{
targetFileName = Path.Combine(targetDir, fi.Name);
File.Move(fi.FullName, targetFileName);
break;
}
}
//删除临时目录
Directory.Delete(tempdir, true);
//检查目标文件是否已经创建
if (File.Exists(targetFileName))
rv = true;
else
rv = false;
}
catch (Exception ex)
{
rv = false;
throw ex;
}
return rv;
}
/// <summary>
/// 获取当前时间点,精确到毫秒
/// </summary>
/// <returns>时间点字符串</returns>
private static string _GetCurrDatetime()
{
DateTime dt = System.DateTime.Now;
string rv = dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Second.ToString() + dt.Millisecond.ToString();
return rv;
}
#endregion
#endregion
}
}