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);
}

相关推荐

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

    2024-03-21 23:48:05       56 阅读
  2. rust - 文件进行zip压缩加密

    2024-03-21 23:48:05       46 阅读
  3. rust 异步zip压缩

    2024-03-21 23:48:05       37 阅读
  4. C#使用SharpZipLib文件进行压缩和解压

    2024-03-21 23:48:05       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 23:48:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 23:48:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 23:48:05       87 阅读
  4. Python语言-面向对象

    2024-03-21 23:48:05       96 阅读

热门阅读

  1. web蓝桥杯真题:灯的颜色变化

    2024-03-21 23:48:05       44 阅读
  2. 软件测试面试接口测试常见问题

    2024-03-21 23:48:05       45 阅读
  3. 【C语言】对称密码——栅栏的加密和解密

    2024-03-21 23:48:05       39 阅读
  4. 什么是虚拟dom

    2024-03-21 23:48:05       41 阅读
  5. Linux之shell文本搜索工具grep

    2024-03-21 23:48:05       41 阅读
  6. android VPN 数据包解析

    2024-03-21 23:48:05       47 阅读
  7. Python从入门到精通秘籍十一

    2024-03-21 23:48:05       43 阅读
  8. ARM day5

    2024-03-21 23:48:05       41 阅读
  9. Redis Pub/Sub: 实时消息传递的完美解决方案

    2024-03-21 23:48:05       45 阅读
  10. Python和FastAPI语义分析和文本图像

    2024-03-21 23:48:05       43 阅读