using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using ICSharpCode.SharpZipLib.Zip;
namespace Top.Api.Util
{
///
/// 异步API下载工具类。
///
public abstract class AtsUtils
{
private const string CTYPE_OCTET = "application/octet-stream";
private static Regex regex = new Regex("attachment;filename=\"([\\w\\-]+)\"", RegexOptions.Compiled);
///
/// 通过HTTP GET方式下载文件到指定的目录。
///
/// 需要下载的URL
/// 需要下载到的目录
/// 下载后的文件
public static string Download(string url, string destDir)
{
string file = null;
try
{
WebUtils wu = new WebUtils();
HttpWebRequest req = wu.GetWebRequest(url, "GET", null);
HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
if (CTYPE_OCTET.Equals(rsp.ContentType))
{
file = Path.Combine(destDir, GetFileName(rsp.Headers["Content-Disposition"]));
using (System.IO.Stream rspStream = rsp.GetResponseStream())
{
int len = 0;
byte[] buf = new byte[8192];
using (FileStream fileStream = new FileStream(file, FileMode.OpenOrCreate))
{
while ((len = rspStream.Read(buf, 0, buf.Length)) > 0)
{
fileStream.Write(buf, 0, len);
}
}
}
}
else
{
throw new TopException(wu.GetResponseAsString(rsp, Encoding.UTF8));
}
}
catch (WebException e)
{
throw new TopException("isv.file-already-download", e.Message);
}
return file;
}
///
/// 解压gzip文件到指定的目录,目前只能解压gzip包里面只包含一个文件的压缩包。
///
/// 需要解压的gzip文件
/// 需要解压到的目录(不能和压缩文件在同一个目录)
/// 解压后的文件
public static string Ungzip(string gzipFile, string destDir)
{
string destFile = Path.Combine(destDir, Path.GetFileName(gzipFile));
using (System.IO.Stream output = File.Create(destFile))
{
using (System.IO.Stream input = new GZipStream(File.Open(gzipFile, FileMode.Open), CompressionMode.Decompress))
{
int size = 0;
byte[] buf = new byte[8192];
while ((size = input.Read(buf, 0, buf.Length)) > 0)
{
output.Write(buf, 0, size);
}
}
}
return destFile;
}
///
/// 解压zip文件到指定的目录。
///
/// 需要解压的zip文件
/// 需要解压到的目录
/// 解压后的文件列表(不包含文件夹)
public static List Unzip(string zipFile, string destDir)
{
List files = new List();
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFile)))
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
if (theEntry.IsDirectory)
{
Directory.CreateDirectory(Path.Combine(destDir, theEntry.Name));
continue;
}
string fileName = Path.Combine(destDir, theEntry.Name);
using (FileStream streamWriter = File.Create(fileName))
{
int size = 0;
byte[] buf = new byte[8192];
while ((size = s.Read(buf, 0, buf.Length)) > 0)
{
streamWriter.Write(buf, 0, size);
}
}
files.Add(fileName);
}
}
return files;
}
///
/// 检查指定文件的md5sum和指定的检验码是否一致。
///
/// 需要检验的文件
/// 已知的md5sum检验码
/// true/false
public static bool CheckMd5sum(string fileName, string checkCode)
{
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString().Equals(checkCode);
}
}
private static string GetFileName(string contentDisposition)
{
Match match = regex.Match(contentDisposition);
if (match.Success)
{
return match.Groups[1].ToString();
}
else
{
throw new TopException("Invalid response header format!");
}
}
}
}