using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace Lib
{
public class ZipHelper
{
private volatile static ZipHelper _instance = null;
private static readonly object lockHelper = new object();
private ZipHelper() { }
/// <summary>
/// 单例模式, 考虑线程安全,只允许一个线程访问。
/// </summary>
public static ZipHelper Instance
{
get
{
if (_instance == null)
{
lock (lockHelper)
{
if (_instance == null)
_instance = new ZipHelper();
}
}
return _instance;
}
}
/// <summary>
/// 解压ZIP文件
/// </summary>
/// <param name="zipFile"></param>
/// <param name="targetDirectory"></param>
/// <param name="passWord"></param>
/// <param name="overWrite"></param>
public ResultEx UnZip(HttpPostedFileBase file, string targetDirectory, string passWord, bool overWrite = true)
{
try
{
if (Directory.Exists(targetDirectory))
Directory.CreateDirectory(targetDirectory); if (!targetDirectory.EndsWith("\\")) targetDirectory += "\\";
using (ZipInputStream zipFiles = new ZipInputStream(file.InputStream))
{
zipFiles.Password = passWord;
ZipEntry theEntry;
while ((theEntry = zipFiles.GetNextEntry()) != null)
{
string directoryName = string.Empty;
string pathToZip = "";
pathToZip = theEntry.Name; if (pathToZip != "")
directoryName = Path.GetDirectoryName(pathToZip) + "\\";
string fileName = Path.GetFileName(pathToZip);
Directory.CreateDirectory(targetDirectory + directoryName); if (fileName != "")
{
if ((File.Exists(targetDirectory + directoryName + fileName) && overWrite) || (!File.Exists(targetDirectory + directoryName + fileName)))
{
using (FileStream streamWriter = File.Create(targetDirectory + directoryName + fileName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = zipFiles.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
} }
}
return ResultEx.Init();
}
catch
{
return ResultEx.Init($"导入失败,当前只能导入ZIP格式请确认格式是否有问题!");
} } /// <summary>
/// 某目录压缩成ZIP压缩文件
/// </summary>
/// <param name="filesPath"></param>
/// <param name="zipFilePath"></param>
public static void CreateZipFile(string filesPath, string zipFilePath)
{
if (!Directory.Exists(filesPath))
{
Console.WriteLine("Cannot find directory '{0}'", filesPath);
return;
}
try
{
string[] filenames = Directory.GetFiles(filesPath);
using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath)))
{ s.SetLevel(9); // 压缩级别 0-9
//s.Password = "123"; //Zip压缩文件密码
byte[] buffer = new byte[4096]; //缓冲区大小
foreach (string file in filenames)
{
ZipEntry entry = new ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
s.Finish();
s.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("Exception during processing {0}", ex);
}
} /// <summary>
/// 选中文件压缩成ZIP文件
/// </summary>
/// <param name="filenames">文件路径集合</param>
/// <param name="zipFilePath">压缩后ZIP路径</param>
/// <returns></returns>
public ResultEx CreateZipFile(List<string> filenames, string zipFilePath,string OutName)
{
if (filenames.Count == 0)
{
return ResultEx.Init(false, "没有找到可以导出的证件");
}
if (!Directory.Exists(zipFilePath))
Directory.CreateDirectory(zipFilePath);
var zipFile = $"{OutName}{ DateTime.Now.ToString("yyyyMMddHHmmss")}.zip";
try
{
using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFilePath + zipFile)))
{
s.SetLevel(9); // 压缩级别 0-9
//s.Password = "123"; //Zip压缩文件密码
byte[] buffer = new byte[4096]; //缓冲区大小
foreach (string file in filenames)
{
ZipEntry entry = new ZipEntry(Path.GetFileName(file));
entry.DateTime = DateTime.Now;
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(file))
{
int sourceBytes;
do
{
sourceBytes = fs.Read(buffer, 0, buffer.Length);
s.Write(buffer, 0, sourceBytes);
} while (sourceBytes > 0);
}
}
s.Finish();
s.Close();
} return ResultEx.Init(true, "压缩成功", zipFile);
}
catch (Exception ex)
{
return ResultEx.Init(ex);
}
}
}
}
  

C# .net 压缩文件解压上传及文件压缩下载的更多相关文章

  1. Flask保存或解压上传的文件

    import os import uuid import shutil import zipfile from flask import Flask, render_template, request ...

  2. PHP自动解压上传的rar文件

    PHP自动解压上传的rar文件   浏览:383 发布日期:2015/07/20 分类:功能实现 关键字: php函数 php扩展 大家都知道php有个zip类可直接操作zip压缩文件,可是用户有时候 ...

  3. 解压上传的zip文件流和文件

    /** * 解压上传的zip文件流 * @param stream * @param outputDirectory */ public static String unzip(InputStream ...

  4. 文件压缩、解压工具类。文件压缩格式为zip

    package com.JUtils.file; import java.io.BufferedOutputStream; import java.io.File; import java.io.Fi ...

  5. 7.Flask-上传文件和访问上传的文件

     1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...

  6. Flask-上传文件和访问上传的文件

     1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...

  7. Java解压上传zip或rar文件,并解压遍历文件中的html的路径

    1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception { HttpSession session = request.getSe ...

  8. C#压缩或解压(rar和zip文件)

    /// <summary> /// 解压RAR和ZIP文件(需存在Winrar.exe(只要自己电脑上可以解压或压缩文件就存在Winrar.exe)) /// </summary&g ...

  9. golang tar gzip 压缩,解压(含目录文件)

    tar是用于文件归档,gzip用于压缩.仅仅用tar的话,达不到压缩的目的.我们常见的tar.gz就是用gzip压缩生成的tar归档文件. go实现tar压缩与解压与zip类似,区别在于tar需要使用 ...

  10. golang zip 压缩,解压(含目录文件)

    每天学习一点go src. 今天学习了zip包的简单使用,实现了含目录的压缩与解压. 写了两个方法,实现了压缩.解压. package ziptest import ( "archive/z ...

随机推荐

  1. ChannelInboundHandlerAdapter和SimpleChannelInboundHandler区别

    ChannelInboundHandlerAdapter和SimpleChannelInboundHandler是我们在使用Netty处理Handler时候很常用的两个继承类,虽然说二者实现的功能大致 ...

  2. Qt开源作品24-遮罩层窗体

    一.前言 在有些项目中,需要在弹框的窗体背后遮罩原有主窗体,使得突出显示弹窗窗体,突然想到之前写过一个全局截屏的东东,原理一致,拿来改改.只需要引入一个头文件和实现文件,然后在主窗体中设置下需要遮罩的 ...

  3. Mac系统Obsidian和Typora更换霞鹜文楷字体

    在github上发现了一款非常好看的字体LXGW WenKai / 霞鹜文楷,这里记录下Mac电脑如何安装这个字体,以及我用到的笔记软件更换字体的过程. Mac安装字体 # 增加代理,不加代理下载速度 ...

  4. ubuntu更换conda的源

    ubuntu更换conda的源有两种方法:一.使用命令行更换Conda源至国内镜像站点.二.直接创建并编辑编辑conda的配置文件.condarc. 一.使用命令行更换Conda源至国内镜像站点 要在 ...

  5. [转]创建Visual Studio 2019离线安装包

    可以在不同的网络环境和不同的计算机上在线安装微软Visual Studio 2019.微软提供的在线安装工具(Visual Studio web installer)可以让用户在线下载最新版本Visu ...

  6. linux下使用CPAN安装Perl模块

    首先从CPAN网站下载CPAN模块 此处使用wget命令直接在linux下下载: wget https://cpan.metacpan.org/authors/id/A/AN/ANDK/CPAN-2. ...

  7. AI对开发过程的替代性

    在过去一年投入人工智能辅助开发之后,虽然大家说使用了人工智能之后工作效率显着提高,但我们日常使用的实际软件似乎并没有明显改善.所以问题出现在哪里? 使用场景 目前团队AI使用主要在以下方面: 代码补全 ...

  8. Appium_iOS测试脚本(1)

    经过不断的调试WebDriverAgent, 现在终于可以执行ios的自动化测试脚本了, # This sample code uses the Appium python client # pip ...

  9. Note - 两类容斥

    \(\S1.\) 等价容斥   (乱取的名字.)   题目将组合对象构成的 "等价类" 进行了定义和限定. 我们往往无法计数 "等价类真的长这样" 的方案, 而 ...

  10. Linux 运维必备 150 个命令汇总

    地址:https://www.linuxcool.com 线上查询及帮助命令 man:全拼manual,用来查看系统中自带的各种参考手册. help:用于显示shell内部命令的帮助信息. 文件和目录 ...