/// <summary>
/// 解压文件
/// </summary>
public class UnZipFile
{
private string _fileName;
public string FileName
{
get
{
return _fileName;
}
set
{
_fileName = value;
}
}
/// <summary>
/// 获取解压文件的进度
/// </summary>
/// <param name="CurrentUnZipFileLength">当前文件解压的流长</param>
/// <param name="length">当前解压文件的总长度</param>
public delegate void GetUnZipFileProgress(int CurrentUnZipFileLength,long length);
/// <summary>
/// 获取解压文件的进度事件
/// </summary>
public event GetUnZipFileProgress GetUnZipFileProgressEvent;
/// <summary>
/// 解压文件
/// </summary>
/// <param name="args">下标为0,是需要解压的源文件,下标为1,是解压后的路径</param>
public void UnZip(string[] args)
{
FileStream fileStream = File.OpenRead(args[0]);
//获取源文件的长度
long length = fileStream.Length;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
int readlength = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);
_fileName = theEntry.Name;
try
{
if (fileName.Length == 0)
{
continue;
}
//生成解压目录
if (directoryName==null)
{
Directory.CreateDirectory(args[1] + theEntry.Name.Replace(fileName, ""));
}
else
{
Directory.CreateDirectory(directoryName + "\\" + theEntry.Name.Replace(fileName, ""));
}
if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1] + theEntry.Name);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
readlength += size;
if(readlength >=length)
{
readlength = (int)length;
}
if (GetUnZipFileProgressEvent!=null)
{
GetUnZipFileProgressEvent(readlength,length);
}
}
else
{
break;
}
}
streamWriter.Flush();
streamWriter.Close();
}
}
catch (Exception ex)
{
fileStream.Close();
s.Close();
throw ex;
//Log.Writer.WriteLog(ex);
}
}
//s.Flush();
fileStream.Close();
s.Close();
}
/// <summary>
/// 从 Zip 包中提取指定的文件
/// </summary>
/// <param name="zipFilename">Zip压缩包</param>
/// <param name="filename">要提取的文件</param>
/// <param name="directoryName">提取后存储的位置</param>
public void ExtractFile(string zipFilename, String filename, String directoryName)
{
FileStream fileStream = File.Open(zipFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
//获取源文件的长度
long length = fileStream.Length;
if (length <= 0)
return;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
int readlength = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
_fileName = theEntry.Name;
string zipEntryName = Path.GetFileName(theEntry.Name);
if (filename.Equals(theEntry.Name))
{
try
{
if (zipEntryName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(System.IO.Path.Combine(directoryName, zipEntryName));
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
readlength += size;
if (readlength >= length)
{
readlength = (int)length;
}
if (GetUnZipFileProgressEvent != null)
{
GetUnZipFileProgressEvent(readlength, length);
}
}
else
{
break;
}
}
streamWriter.Flush();
streamWriter.Close();
}
}
catch (Exception ex)
{
fileStream.Close();
s.Close();
throw ex;
//Log.Writer.WriteLog(ex);
}
break;
}
}//end while
//s.Flush();
fileStream.Close();
s.Close();
}//end method
/// <summary>
/// 解压指定文件夹(但是此文件夹不能嵌套文件夹)
/// </summary>
/// <param name="args">下标为0,是需要解压的源文件,下标为1,是解压后的路径</param>
/// <param name="folderName">指定文件夹名称</param>
public void UnZipSpecifiedFolder(string[] args, string folderName,string serverId)
{
FileStream fileStream = File.OpenRead(args[0]);
//获取源文件的长度
long length = fileStream.Length;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
int readlength = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string theEntryName = null;
if (serverId!=null&&serverId!="")
{
theEntryName = theEntry.Name.Replace("/"+serverId,"");
}
else
{
theEntryName = theEntry.Name;
}
string fileName = Path.GetFileName(theEntryName);
_fileName = theEntry.Name;
try
{
if (fileName.Length == 0)
{
continue;
}
string str = Path.
GetDirectoryName(theEntry.Name.Replace(fileName, ""));
string strs = Path.GetDirectoryName(theEntry.Name.Replace(fileName, "")).Replace(serverId + "\\","");
if (Path.GetDirectoryName(theEntry.Name.Replace(fileName, "")).Replace(serverId+"\\","") != folderName)
{
continue;
}
//生成解压目录
if (directoryName == null)
{
Directory.CreateDirectory(args[1] + theEntry.Name.Replace(fileName, ""));
}
else
{
Directory.CreateDirectory(directoryName + "\\" + theEntry.Name.Replace(fileName, ""));
}
if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1] + theEntry.Name);
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
readlength += size;
if (readlength >= length)
{
readlength = (int)length;
}
if (GetUnZipFileProgressEvent != null)
{
GetUnZipFileProgressEvent(readlength, length);
}
}
else
{
break;
}
}
streamWriter.Flush();
streamWriter.Close();
}
}
catch (Exception ex)
{
throw ex;
//Log.Writer.WriteLog(ex);
}
}
//s.Flush();
fileStream.Close();
s.Close();
}
/// <summary>
/// 解压制定文件夹或文件
/// </summary>
/// <param name="zipPath">压缩文件路径</param>
/// <param name="filePath">指定文件或文件夹路径</param>
/// <param name="savePath">解压后存放路径</param>
/// <param name="isFloder">是否是文件夹 1 是 0 否</param>
/// <param name="isHasDirectory">当是指定文件夹时是否保存文件夹 1 是 0否</param>
/// <param name="fileNames">不需解压的文件名多个文件名以|分割 没有传空</param>
public void UnZipedFile(string zipPath,string filePath,string savePath,string isFloder,string isHasDirectory,string fileNames)
{
switch (isFloder)
{
case"1":
SpecifyFolder(zipPath, filePath, savePath, isHasDirectory,fileNames);
break;
case"2":
SpecifyFile(zipPath, filePath, savePath,fileNames);
break;
default:
break;
}
}
/// <summary>
/// 压缩文件中是否存在指定文件
/// </summary>
/// <param name="zipPath">压缩文件路径</param>
/// <param name="filePath">指定文件路径</param>
/// <returns>是否存在 true 是 false 否</returns>
public bool IsHasFile(string zipPath, string filePath)
{
FileStream fileStream = File.Open(zipPath, FileMode.Open, FileAccess.Read, FileShare.Read);
bool isHasFile = false;
//获取源文件的长度
long length = fileStream.Length;
if (length <= 0)
return isHasFile;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
_fileName = theEntry.Name;
string zipEntryName = Path.GetFileName(theEntry.Name);
string mFileName = Path.GetFileName(filePath);
string mDirectoryName = Path.GetDirectoryName(filePath);
string zipDirectoryName = zipPath + "\\";
if (!theEntry.Name.Equals(@"/"))
{
zipDirectoryName += Path.GetDirectoryName(theEntry.Name).Replace(@"\", "\\");
}
//不是这个文件夹的同名文件不能解压
if (mFileName.Equals(zipEntryName) && mDirectoryName.Equals(mDirectoryName))
{
try
{
if (zipEntryName != String.Empty)
{
isHasFile=true;
}
}
catch (Exception e)
{
isHasFile = false;
//Log.Writer.WriteLog(ex);
}
break;
}
}
fileStream.Close();
s.Close();
return isHasFile;
}
/// <summary>
/// 解压制定文件
/// </summary>
/// <param name="zipFilename">压缩文件路径</param>
/// <param name="filename">指定文件路径</param>
/// <param name="savePath">解压后存放路径</param>
///<param name="fileNames">不需解压的文件名多个文件名以|分割 没有传空</param>
public void SpecifyFile(string zipPath, string filePath, string savePath,string fileNames)
{
FileStream fileStream = File.Open(zipPath, FileMode.Open, FileAccess.Read, FileShare.Read);
//获取源文件的长度
long length = fileStream.Length;
if (length <= 0)
return;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
int readlength = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
_fileName = theEntry.Name;
string zipEntryName = Path.GetFileName(theEntry.Name);
string mFileName = Path.GetFileName(filePath);
string mDirectoryName = Path.GetDirectoryName(filePath);
string zipDirectoryName = zipPath + "\\";
if (!theEntry.Name.Equals(@"/"))
{
zipDirectoryName += Path.GetDirectoryName(theEntry.Name).Replace(@"\", "\\");
}
//不是这个文件夹的同名文件不能解压
if (mFileName.Equals(zipEntryName) && mDirectoryName.Equals(mDirectoryName))
{
try
{
if (zipEntryName != String.Empty)
{
if (!fileNames.Contains(zipEntryName))
{
//解压文件到指定的目录
string saveFilePath = System.IO.Path.Combine(savePath, zipEntryName);
if (System.IO.File.Exists(saveFilePath))
{
DeleteOldFile dOldFile = new DeleteOldFile();
dOldFile.RenameOldFile(saveFilePath);
}
FileStream streamWriter = File.Create(System.IO.Path.Combine(savePath, zipEntryName));
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
readlength += size;
if (readlength >= length)
{
readlength = (int)length;
}
}
else
{
break;
}
}
streamWriter.Flush();
streamWriter.Close();
}
}
}
catch (Exception ex)
{
throw ex;
//Log.Writer.WriteLog(ex);
}
break;
}
}
fileStream.Close();
s.Close();
}
/// <summary>
/// 解压制定文件夹
/// </summary>
/// <param name="zipFilename">压缩文件路径</param>
/// <param name="filename">指定文件夹路径</param>
/// <param name="savePath">解压后存放路径</param>
/// <param name="isHasDirectory">当是指定文件夹时是否保存文件夹 1 是 0否</param>
/// <param name="fileNames">不需解压的文件名多个文件名以|分割 没有传空</param>
public void SpecifyFolder(string zipFilename, string filename, string savePath,string isHasDirectory,string fileNames)
{
FileStream fileStream = File.Open(zipFilename, FileMode.Open, FileAccess.Read, FileShare.Read);
//获取源文件的长度
long length = fileStream.Length;
if (length <= 0)
return;
//获取读取流
ZipInputStream s = new ZipInputStream(fileStream);
ZipEntry theEntry;
int readlength = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
_fileName = theEntry.Name;
string zipEntryName = Path.GetFileName(theEntry.Name);
string mFileName = Path.GetFileName(filename);
string zipDirectoryName = zipFilename + "\\";
if (!theEntry.Name.Equals(@"/"))
{
zipDirectoryName += Path.GetDirectoryName(theEntry.Name).Replace(@"\", "\\");
}
if (zipDirectoryName.Contains(filename))//非此文件夹内的文件不能解压缩
{
try
{
string mDirectoryName = System.IO.Path.Combine(savePath, Path.GetDirectoryName(theEntry.Name));
//是否只要文件 1 是
if (isHasDirectory.Equals("1"))
{
if (!Directory.Exists(mDirectoryName))
{
Directory.CreateDirectory(mDirectoryName);
}
}
if (zipEntryName != String.Empty)
{
if (!fileNames.Contains(zipEntryName))
{
//解压文件到指定的目录
string saveFilePath = System.IO.Path.Combine(savePath, zipEntryName);
if (System.IO.File.Exists(saveFilePath))
{
DeleteOldFile dOldFile = new DeleteOldFile();
dOldFile.RenameOldFile(saveFilePath);
}
FileStream streamWriter = File.Create(System.IO.Path.Combine(savePath, zipEntryName));
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
readlength += size;
if (readlength >= length)
{
readlength = (int)length;
}
}
else
{
break;
}
}
streamWriter.Flush();
streamWriter.Close();
}
}
}
catch (Exception ex)
{
fileStream.Close();
s.Close();
throw ex;
//Log.Writer.WriteLog(ex);
}
}
}//end while
//s.Flush();
fileStream.Close();
s.Close();
}
}