需求:一个文件夹中有很多不同类型的文件(不含文件夹,文件类型有:zip\pdf\jpg...)根据文件名称可以从数据库中查询到自己的编码和类型,每个编码下可能有多个不同类型的文件。原件如图,为了方便理解,名称改成:编码_类别_文件名:
编码是01,类别是个人信息\身份证照,最后想要打包下载好各类的文件,效果如下:
解压后效果如下:
实现代码:
public string DaBao2()
{
//办件编号 获取编号
string projid = Request["PROJId"].TryToString("");
//获取项目名
var PROJNAME = Server.UrlDecode(Request["PROJNAME"]);
//处理项目名
PROJNAME = PROJNAME.TrimStart("关于".ToArray());
PROJNAME = PROJNAME.TrimEnd("申请取水许可".ToArray());
PROJNAME = PROJNAME.TrimEnd("取水许可申请书".ToArray());
//获取 数据库中编号下的所有文件
var pre_attrList = DB.Queryable<pre_attr>()
.Where(it => it.PROJID == projid)
.Select(it => new
{
it.PROJID,
it.ATTRNAME,
it.FILE_URL,
it.FILENAME,
SORTID=SqlFunc.ToInt32(it.SORTID)
}).ToList();
//排序
int minSort = pre_attrList.Min(m => m.SORTID).TryToInt();
//处理项目名(就是大的压缩包的名字)
switch (minSort)
{
case 1:
PROJNAME += "-新补办";
break;
case 8:
PROJNAME += "-取水许可延续";
break;
case 11:
PROJNAME += "-取水许可变更";
break;
default:
break;
}
var files = new List<Common.zFile>();
foreach (var pre_attr in pre_attrList)
{
//判断文件路径是否为空
if (string.IsNullOrWhiteSpace(pre_attr.FILE_URL))
{
continue;
}
//判断文件物理路径是否不存在
var fileurl = Server.MapPath(pre_attr.FILE_URL);
if (!System.IO.File.Exists(fileurl))
{
continue;
}
//添加可压缩的文件路径和压缩后的路径
files.Add(new Common.zFile
{
filePath = Server.MapPath(pre_attr.FILE_URL),
// 路径=项目名称/分类名/文件名
zipPath = PROJNAME + "/" + pre_attr.ATTRNAME + "/" + pre_attr.FILENAME,
});
}
//如果list为空
if (files.Count == 0)
{
return "error1";
}
//压缩好的文件存放路径
var zipurl = Server.MapPath("/yasuo/" + projid + "/" + PROJNAME + ".zip");
//如果存放目录不存在创建
var filewjj = Server.MapPath("/yasuo/" + projid);
if (!Directory.Exists(filewjj))
{
Directory.CreateDirectory(filewjj);
}
//将办件编号下的各个文件添加到对应路径下的压缩文件中
ZipHelper.Zip(files, zipurl);
var returnurl = "/yasuo/" + projid + "/" + PROJNAME + ".zip";
return returnurl;
}
【ZipHelper.Zip】
/// <summary>
/// 压缩多个文件
/// </summary>
/// <param name="files">文件列表</param>
/// <param name="ZipedFileName">压缩包文件名及路径</param>
/// <returns></returns>
public static void Zip(List<zFile> files, string ZipedFileName)
{
Zip( files, ZipedFileName, string.Empty);
}
/// <summary>
/// 压缩多个文件
/// </summary>
/// <param name="files">文件列表</param>
/// <param name="ZipedFileName">压缩包文件名及路径</param>
/// <param name="Password">解压码</param>
/// <returns></returns>
public static void Zip(List<zFile> files, string ZipedFileName, string Password)
{
files = files.Where(f => File.Exists(f.filePath)).ToList();
if (files.Count == 0) throw new FileNotFoundException("未找到指定打包的文件");
ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFileName));
s.SetLevel(6);
if (!string.IsNullOrEmpty(Password.Trim())) s.Password = Password.Trim();
ZipFileDictory( files, s);
s.Finish();
s.Close();
}
private static void ZipFileDictory(List<zFile> files, ZipOutputStream s)
{
ZipEntry entry = null;
FileStream fs = null;
Crc32 crc = new Crc32();
try
{
//创建当前文件夹
//entry = new ZipEntry("/"); //加上 “/” 才会当成是文件夹创建
//s.PutNextEntry(entry);
//s.Flush();
foreach (zFile file in files)
{
//打开压缩文件
fs = File.OpenRead(file.filePath);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
entry = new ZipEntry(file.zipPath);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
finally
{
if (fs != null)
{
fs.Close();
fs = null;
}
if (entry != null)
entry = null;
GC.Collect();
}
}
就这样。