当前位置: 首页 > news >正文

rust - 对文件夹进行zip压缩加密

本文提供了一种对文件夹进行zip压缩并加密的方法。

添加依赖

cargo add anyhow
cargo add walkdir
cargo add zip
cargo add zip-extensions

计算文件夹的大小

目的是对需要压缩的文件夹的大小做一个限制。当然如果资源足够的话,可以去掉此限制。

    let mut total_size: u64 = 0;// 计算文件夹的大小for metadata in WalkDir::new(source_dir).min_depth(1).max_depth(max_depth).into_iter()// 忽略正在运行的进程或无权访问的目录.filter_map(|entry| entry.ok()).filter_map(|entry| entry.metadata().ok())// 只计算文件.filter(|metadata| metadata.is_file()){total_size += metadata.len();}

压缩并加密文件夹

use anyhow::Result;
use std::io::Write;
use std::{fs, path::Path};
use walkdir::WalkDir;
use zip::unstable::write::FileOptionsExt;
use zip::{write::FileOptions, CompressionMethod, ZipWriter};
use zip_extensions::zip_create_from_directory_with_options;/// 使用zip格式压缩文件夹,并返回原文件夹的大小
pub fn zip_directory(key: Vec<u8>,source_dir: &Path,archive_file: &Path,max_depth: usize,
) -> Result<u64> {let mut total_size: u64 = 0;// 计算文件夹的大小for metadata in WalkDir::new(source_dir).min_depth(1).max_depth(max_depth).into_iter()// 忽略正在运行的进程或无权访问的目录.filter_map(|entry| entry.ok()).filter_map(|entry| entry.metadata().ok())// 只计算文件.filter(|metadata| metadata.is_file()){total_size += metadata.len();// todo 可以在此对文件夹大小上限进行判断,如果超出上限,则// return Ok(total_size);}// 压缩加密文件夹let options = FileOptions::default().compression_method(CompressionMethod::DEFLATE).with_deprecated_encryption(&key);zip_create_from_directory_with_options(&archive_file.to_path_buf(),&source_dir.to_path_buf(),options,).unwrap();Ok(total_size)
}

单元测试

use std::env;#[test]
fn test_zip_directory() {let src_file_path = env::current_dir().unwrap().join("tests");let dst_file_path = env::current_dir().unwrap().join("tests.zip");let key = get_random_key16();let _ = zip_directory(key.to_vec(), &src_file_path, &dst_file_path, 10);
}
http://www.lryc.cn/news/324678.html

相关文章:

  • ETL数据倾斜与资源优化
  • Python的asyncio:异步编程的利器
  • nodejs+vue高校奖助学金系统python-flask-django-php
  • 已解决redis.clients.jedis.exceptions.JedisMovedDataException异常的正确解决方法,亲测有效!!!
  • 政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(五)—— Dropout和批归一化
  • nodejs+vue高校会议室预订管理系统python-flask-django-php
  • 文件夹读取不到文件:深度解析与高效恢复策略
  • python—接口编写部分
  • 手机IP地址如何更换
  • 【R包开发:包的组件】 第4章 包的元数据
  • Office办公软件之word的使用(一)
  • OpenGL+QT实现矢量和影像的叠加绘制
  • vue基础——java程序员版(vuex)
  • ubuntu20.04安装 ffmpeg 开发环境
  • 微软开源Garnet高性能缓存服务安装
  • 云计算系统管理(ADMIN)
  • Spark spark-submit 提交应用程序
  • IOS面试题编程机制 51-55
  • 话题——AI大模型学习
  • MySQL基础复习
  • Zookeeper(八)序列化与协议
  • 人工智能之Tensorflow变量作用域
  • ElasticSearch插件安装及配置
  • vue+Echarts实现多设备状态甘特图
  • STM32使用滴答定时器实现delayms
  • k8s的volumn解析
  • Golang获取音视频时长信息
  • LeetCode 面试经典150题 14.最长公共前缀
  • 自注意力机制的理解
  • win10-误删winsock恢复方法