rust 异步zip解压缩

在使用actix-web框架的时候,如果使用zip解压任务将会占用一个工作线程,因为zip库是同步阻塞的,想用异步非阻塞需要用另一个库,下面列出同步解压,跟异步解压的两个方法实现,异步解压不会占用工作线程。

阻塞解压

依赖库

zip = "0.6.6"

rust代码

pub fn unzip<P: AsRef<std::path::Path>>(file_path: P,unzip_path: P,
) -> Result<(), std::io::Error> {let file_path = file_path.as_ref();let unzip_path = unzip_path.as_ref();let unzip_path = std::path::Path::new(unzip_path);if unzip_path.exists() {std::fs::remove_dir_all(unzip_path)?;} else {std::fs::create_dir_all(unzip_path)?;}let file = std::fs::File::open(file_path)?;let mut archive = zip::ZipArchive::new(file)?;for index in 0..archive.len() {let mut file = archive.by_index(index)?;let file_name = file.mangled_name();let outpath = unzip_path.join(file_name);if file.is_dir() {std::fs::create_dir_all(&outpath)?;} else {if let Some(p) = outpath.parent() {if !p.exists() {std::fs::create_dir_all(p)?;}}let mut outfile = std::fs::File::create(&outpath)?;std::io::copy(&mut file, &mut outfile)?;}}return Ok(());
}

异步解压

依赖库

async_zip = { version = "0.0.17", features = ["tokio", "tokio-fs", "deflate"] }
futures-lite = "2.3.0"
tokio = { version = "1.35.1", features = ["macros"] }
tokio-util = "0.7.10"

rust代码

use async_zip::base::read::seek::ZipFileReader;
use async_zip::base::write::ZipFileWriter;
use async_zip::ZipEntryBuilder;
use tokio::fs::OpenOptions;
use tokio_util::compat::{TokioAsyncReadCompatExt, TokioAsyncWriteCompatExt};pub async fn unzip_async<P: AsRef<std::path::Path>>(file_path: P,unzip_path: P,
) -> Result<(), ApiError> {let unzip_path = unzip_path.as_ref();if unzip_path.exists() {std::fs::remove_dir_all(unzip_path)?;} else {std::fs::create_dir_all(unzip_path)?;}let file = tokio::fs::File::open(file_path.as_ref()).await?;let reader = tokio::io::BufReader::new(file);let mut zip = ZipFileReader::with_tokio(reader).await.map_err(ApiError::from)?;for index in 0..zip.file().entries().len() {let entry = zip.file().entries().get(index).ok_or(ApiError::msg("zip entry not found"))?;let raw = entry.filename().as_bytes();let mut file_name = &String::from_utf8_lossy(raw).to_string(); //必需转换为utf8,不能使用自带的,会乱码let outpath = unzip_path.join(file_name);if file_name.ends_with("/") {tokio::fs::create_dir_all(&outpath).await?;} else {if let Some(p) = outpath.parent() {if !p.exists() {tokio::fs::create_dir_all(p).await?;}}let mut entry_reader = zip.reader_without_entry(index).await.map_err(ApiError::from)?;let mut writer = OpenOptions::new().write(true).create_new(true).open(&outpath).await.map_err(ApiError::from)?;futures_lite::io::copy(&mut entry_reader, &mut writer.compat_write()).await?;}}Ok(())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/799502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 配置BCompare工具

一、Git配置BCompare工具 1、安装BCompare工具 下载BCompare安装包&#xff0c;打开安装包直接安装即可&#xff0c;如下&#xff1a; 2、禁止BCompare访问网络 网络进出站进行配置&#xff0c;限制BCompare访问网络&#xff0c;如果不进行上网限制&#xff0c;可能存在被封的…

接口新增方法

JDK8开始接口新增的方法 JDK7以前&#xff1a;接口只能定义抽象方法 JDK8的新特性&#xff1a;接口中可以定义有方法体的方法。&#xff08;默认、静态&#xff09; JDK9的新特性&#xff1a;接口中可以定义私有方法 JDK8以后接口中新增的方法&#xff1a; 允许在接口中定义默认…

【24届数字IC秋招总结】实习面试经验——华为芯片与器件设计工程师实习生

文章目录 前言一、笔试和性格测试二、面试2.1 技术面2.2 hr面前言 实习:笔试 + 1轮技术面 + 1轮主管面 一、笔试和性格测试 笔试题链接 1、网上可以找到很多以往的题目,需要注意的是数字芯片岗位会考到很多验证、中后端的知识,主打一个全栈,不要只看设计或者只看验证的东…

tx-lcn使用

tx-lcn是啥 tx-lcn是一个分布式事务框架&#xff0c;有两个模块组成管理端&#xff08;server&#xff09;和client端。 管理端用于分布式事务的注册&#xff0c;事务消息接收&#xff0c;事务消息下发等管理工作。 client端包括事务发起方&#xff0c;事务参与方。 LCN名称是…

11.手写JavaScript apply方法

一、核心思想 apply方法和call方法相似&#xff0c;区别在于参数&#xff0c;我们可以使用apply方法的原理实现apply方法 二、代码实现 /*** 手写apply* param {Function} o 函数* param {Array} args 数组* return 根据具体情况考虑*/ function Fn(a,b,c,d){console.log(&q…

Spring Security——08,自定义失败处理

自定义失败处理 一、自定义实现类1.1 实现AccessDeniedHandler1.2 实现AuthenticationEntryPoint 二、配置SpringSecurity三、测试3.1 认证失败3.2 权限不足 一键三连有没有捏~~ 我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json&#xff0c…

定义默认参数要牢记一点:默认参数必须指向不变对象!

定义默认参数要牢记一点&#xff1a;默认参数必须指向不变对象&#xff01; 默认参数很有用&#xff0c;但使用不当&#xff0c;也会掉坑里。默认参数有个最大的坑&#xff0c;演示如下&#xff1a; 先定义一个函数&#xff0c;传入一个list&#xff0c;添加一个END再返回&am…

工业视觉检测

目录 我对工业视觉检测的了解 一、关键组成部分 二、应用场景 三、技术挑战 我对工业视觉检测的了解 工业视觉检测是利用机器视觉技术对产品质量进行自动化检查的过程&#xff0c;它在制造业中扮演着至关重要的角色&#xff0c;用于确保产品质量、提高生产效率、减少人工成…

比特币4种地址格式

原生隔离见证、嵌套隔离见证、Taproot和Legacy都是比特币网络中不同的比特币地址格式或交易类型。每一种都有自己的特点和好处: 1.本地隔离见证(Segregated Witness Bech32): 钱包的支持 Phantom, Leather, Unisat, Okex Wallet 本地隔离见证地址以 bc1开始&#xff0c;也称为…

动态规划(2)

动态规划&#xff08;2&#xff09; 文章目录 动态规划&#xff08;2&#xff09;1、聪明的寻宝人2、基因检测3、药剂稀释4、找相似串 1、聪明的寻宝人 #include <iostream> using namespace std; void MaxValue(int values[], int weights[], int n, int m) {int dp[21…

Linux从入门到精通 --- 4(上).快捷键、软件安装、systemctl、软链接、日期和时区、IP地址

文章目录 第四章(上)&#xff1a;4.1 快捷键4.1.1 ctrl c 强制停止4.1.2 ctrl d 退出4.1.3 history4.1.4 历史命令搜索4.1.5 光速移动快捷键4.1.6 清屏 4.2 软件安装4.2.1 yum4.2.2 apt 4.3 systemctl4.4 软链接4.4.1 ln 4.5 日期和时区4.5.1 date命令4.5.2 date进行日期加减…

题目 2011: 电导流的矩形

题目描述: 地图上有若干个导电矩形&#xff0c;长度大小不一&#xff08;矩形四个角的坐标x&#xff0c;y<10000&#xff09;而且电工觉得&#xff0c;反正矩形很标准&#xff0c;边都平行于坐标轴&#xff0c;所以矩形随便给两个对角的点就够了……这电工觉得你够聪明。 …

STC89C51学习笔记(五)

STC89C51学习笔记&#xff08;五&#xff09; 综述&#xff1a;文本讲述了代码中速写模板的创建、如何将矩阵键盘的按键与数字一一对应以及如何创建一个矩阵键盘密码锁。 一、速写模板 点击“templates”&#xff0c;再鼠标右键选择配置&#xff0c;按照以下方式即可修改一些…

倒反天罡的ssh后门 | Linux 后门系列

0x00 简介 今天看见有安全研究员发了一篇 ssh 后门的文章&#xff0c;复现思考后分享给大家 https://blog.thc.org/infecting-ssh-public-keys-with-backdoors 0x01 ssh密钥登录 参考 https://www.commandlinux.com/man-page/man5/authorized_keys.5.html 运维人员管理 Linux …

【Linux ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…

若依中editor禁用

this.$refs.editor.Quill.enable(false) 引用&#xff1a;https://blog.csdn.net/qq_33475629/article/details/124615384 图片还是可以用

rsync 远程同步----------安全高效的异地备份策略

目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器-------…

【Leetcode每日一题】 动态规划 - LCR 166. 珠宝的最高价值(难度⭐⭐)(52)

1. 题目解析 题目链接&#xff1a;LCR 166. 珠宝的最高价值 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了 2.算法原理 想象一下&#xff0c;你正在玩一个寻宝游戏&#xff0c;游戏地图是一个二维网格&#xff0c;每个格子都藏有一…

单片机IGBT驱动电路一例

概述&#xff1a; 驱动的作用有三个&#xff1a; 1.是作为放大器获得所需要的驱动电压。 2.是提高输出电流能力。 3.是进行功率回路和控制回路的隔离 信号从MCU到IGBT驱动芯片 首先驱动电流需要放大 MCU的输出电流是mA级别&#xff0c;而IGBT需要的驱动电流可能达到几安培…

SpringCloud Alibaba Sentinel 简介和安装

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十三篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 简介和安装。 二、Sentinel 简介 2.1 Sent…