rust递归遍历磁盘目录及文件

 Std库实现

//遍历dir目录,找出修改日期距离当前超过age天的文件名称,存入file_list中
fn visit_dir(dir: &Path, file_list: &mut Vec<String>, age: u64) -> io::Result<()> {if dir.is_dir() {for entry in fs::read_dir(dir)? {let entry = entry?;let path = entry.path();if path.is_dir() {visit_dir(&path, file_list, age)?;} else {let file_matedata = fs::metadata(entry.path()).unwrap();let modify_time = file_matedata.modified()?;if modify_time + Duration::from_secs(age * 24 * 60 * 60) < SystemTime::now(){file_list.push(entry.path().to_str().unwrap().to_string());}}}}Ok(())
}//遍历dir目录,找出空目录(内部无文件,无目录)
fn get_empty_dir(dir: &Path, dir_list: &mut Vec<String>) -> io::Result<()>{if !dir.is_dir() {return Ok(());}let read_dir = fs::read_dir(dir)?;let cnt = read_dir.count();if cnt == 0 {dir_list.push(dir.to_str().unwrap().to_owned());return Ok(());}let read_dir = fs::read_dir(dir)?;for entry in read_dir{let entry = entry?;let path = entry.path();if path.is_dir() {get_empty_dir(path.as_path(), dir_list)?;}}Ok(())
}

上述函数实现比较直接,需要注意fs::read_dir()函数返回值后面的?宏,从read_dir返回值中提取结果。如visit_dir、get_empty_dir函数定义返回值不是io::Result类型,使用?宏,会报错。因为?宏还涉及错误传播,需要io::Result参与。

Tokio实现

Rust的异步递归函数实现比较繁琐,为了简化,导入如下Crate:

async-recursion = "1.0.5"
use async_recursion::async_recursion;
#[async_recursion]
async fn visit_dir_async(dir: &Path, file_list: &mut Vec<String>, age: u64) {if dir.is_dir() {//for entry in tokio::fs::read_dir(dir).flat_map().await? {let mut entries = tokio::fs::read_dir(dir).await.unwrap();while let Some(entry) = entries.next_entry().await.unwrap() {let path = entry.path();if path.is_dir() {visit_dir_async(&path, file_list, age).await;} else {let file_matedata = tokio::fs::metadata(entry.path()).await.unwrap();let modify_time = file_matedata.modified().unwrap();if modify_time + Duration::from_secs(age * 24 * 60 * 60) < SystemTime::now(){file_list.push(entry.path().to_str().unwrap().to_string());}}}}()
}#[async_recursion]
async fn get_empty_dir_async(dir: &Path, dir_list: &mut Vec<String>) {println!("check path:{}", dir.to_str().unwrap());if !dir.is_dir() {return;}let mut read_dir = tokio::fs::read_dir(dir).await.unwrap();if let None = read_dir.next_entry().await.unwrap(){println!("find none path");dir_list.push(dir.to_str().unwrap().to_owned());return;}let mut read_dir = tokio::fs::read_dir(dir).await.unwrap();while let Some(entry) = read_dir.next_entry().await.unwrap(){let path = entry.path();if path.is_dir() {get_empty_dir_async(path.as_path(), dir_list).await;}}
}

调用

use tokio::io::{self, BufReader, AsyncBufReadExt, BufWriter, AsyncWriteExt};
use tokio::fs::{File, try_exists, remove_file, read_to_string, copy, read_dir};
use std::path::{PathBuf};use std::fs::File as fsFile;
use std::fs;
use std::path::Path;
use std::fs::{DirEntry};
use std::time::{Duration, SystemTime};#[tokio::main]
async fn main() -> io::Result<()> {let source_dir = "E:\\xxxxxx\\Log\\";//获取目录中的全部文件let mut file_list: Vec<String> = Vec::new();let path = Path::new(source_dir);visit_dir(path, &mut file_list, 30)?;for file in file_list{println!("{}", file);}let mut empty_file_list: Vec<String> = Vec::new();let path = Path::new(source_dir);get_empty_dir(path, &mut empty_file_list)?;for dir in empty_file_list{println!("{}", dir);}println!("====tokio==================================");let source_dir = "E:\\xxxxxx\\Log\\";//获取目录中的全部文件let mut file_list: Vec<String> = Vec::new();let path = Path::new(source_dir);visit_dir_async(path, &mut file_list, 30).await;for dir in file_list{println!("tokio {}", dir);}println!("====tokio==================================");let mut empty_file_list: Vec<String> = Vec::new();get_empty_dir_async(path, &mut empty_file_list).await;for dir in empty_file_list{println!("tokio {}", dir);}Ok(())
}

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

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

相关文章

假期2.8

数据类型与作用域练习 1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &a…

Redis 双写一致性

问题&#xff1a;redis 作为缓存&#xff0c;mysql 的数据如何与 redis 进行同步呢&#xff1f;&#xff08;双写一致性&#xff09; 双写一致性是指当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 读操作&#xff1a;缓存命中&…

Ubuntu防火墙设置

一台trinitycore服务器&#xff0c;使用frp放开了它的8085端口&#xff0c;但是客户端无法连通它的这个端口&#xff0c;怀疑它开了防火墙&#xff0c;但是以前是使用宝塔面板开的防火墙&#xff0c;现在宝塔面板已经被删除了&#xff0c;不太确定它是否还有防火墙&#xff0c;…

C++ 设计模式之单例模式

单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。以下是一个简单的C例程&#xff0c;演示了单例模式的实现。在这个例子中&#xff0c;我们创建了一个名为 Singleton 的类&#xff0c;它只能创建一个实例。 #include <iostream>class Singleton { pub…

深入探究 HTTP 简化:httplib 库介绍

✏️心若有所向往&#xff0c;何惧道阻且长 文章目录 简介特性主要类介绍httplib::Server类httplib::Client类httplib::Request类httplib::Response类 示例服务器客户端 总结 简介 在当今的软件开发中&#xff0c;与网络通信相关的任务变得日益普遍。HTTP&#xff08;Hypertext…

一文彻底搞懂Java中wait和sleep方法的区别

文章目录 1. 所属类和调用方式2. 对锁的处理机制3. 唤醒机制4. 用途5. 异常处理6. 总结 wait()和sleep()方法都是Java中用于线程控制的方法&#xff0c;它们都让线程暂停执行&#xff0c;但它们之间存在一些区别&#xff1a; 1. 所属类和调用方式 wait()方法属于Object类&…

QT+OSG/osgEarth编译之八十四:osgdb_osg+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_osg)

文章目录 一、osgdb_osg介绍二、文件分析三、pro文件四、编译实践一、osgdb_osg介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_osg是osgDB模块中的一个插件,它提供了对OSG格式的支持。 OSG格式是OpenSceneGraph库使用的一种二进制文件…

备战蓝桥杯---数学基础2

学了常见的筛法&#xff0c;让我们看个题&#xff1a; 首先&#xff0c;我们知道欧拉筛复杂度为nlognlogn,这题可以承受&#xff0c;但是空间上存不了&#xff0c;而如果我们枚举1--n^1/2&#xff0c;复杂度不允许。 其实在枚举的方法中&#xff0c;我们只需找出有无在【2&…

JavaScript脚本:async,defer

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript 脚本 是 web 开发中的重要组成部分&#xff0c;用于为网…

学习数据结构和算法的第5天

空间复杂度及其常见案例 空间复杂度 空间复杂度也是一个数学函数表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。空间复杂度…

vtk三维场景基本要素 灯光、相机、颜色、纹理映射 简介

整理一下VTK 三维场景基本要素&#xff0c;后面会一一进行整理&#xff1b; 1. 灯光 vtkLight 剧场里有各式各样的灯光&#xff0c;三维渲染场景中也一样&#xff0c;可以有多个灯光存在。灯光和相机 是三维渲染场景必备的要素&#xff0c;vtkRenderer会自动创建默认的灯光和…

基于查询模板的知识图谱问答系统

目录 前言1 知识图谱问答系统的两个核心问题1.1 问句的表示与语义理解1.2 知识库的映射和匹配 2 问答基本流程2.1 模板生成2.2 模板实例化2.3 查询排序和结果获取 3 模板自动生成3.1 quint方法3.2 对齐任务 4 基于查询模板的知识图谱问答系统优缺点4.1 系统的优点4.2 系统的缺点…

阿里云游戏服务器租用费用价格组成,费用详单

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

gem5学习(19):gem5内存系统——The gem5 Memory System

目录 一、Model Hierarchy 二、CPU 三、Data Cache Object 四、Tags & Data Block 五、MSHR and Write Buffer Queues 六、Memory Access Ordering 七、Coherent Bus Object 八、Simple Memory Object 九、Message Flow 1、Memory Access Ordering&#xff08;re…

C++ shell - 在线 C++ 编译器

C shell - 在线 C 编译器 1. C shell2. Example program3. Options4. ExecutionReferences 1. C shell C Shell v2 https://cpp.sh/ https://cpp.sh/about.html C Shell v2, free online compiler, proudly uses emscripten to compile your code. emscripten is a clang-ba…

【计算机网络】Web HTTP

Web和HTTP HTTP 超文本传输协议 HyperText Transfer Protocol HTTP使用TCP作为支撑传输协议 由一个客户程序和一个服务器程序实现一些常见名词。。。无状态协议 stateless protocol 不保存关于客户的任何信息非持续/持续链接 non-persistent con…

深入浅出:MongoDB聚合管道的技术详解

随着数据量的不断增加&#xff0c;对于数据的有效查询和分析变得愈发重要。MongoDB作为一款高性能的NoSQL数据库&#xff0c;提供了强大的聚合管道&#xff08;Aggregation Pipeline&#xff09;功能&#xff0c;帮助开发者轻松地实现复杂的数据分析任务。本文将深入剖析聚合管…

Nginx 禁用静态文件缓存

在 Nginx 中完全禁用缓存静态文件&#xff0c;在 Nginx 的配置文件中&#xff0c;找到处理静态文件的 /location 配置块&#xff0c;如下&#xff1a; location / { root /path/to/static/files; ... } 在该配置块中&#xff0c;可以添加以下指令来禁用缓存&#xff1…

【数据结构】双向链表(链表实现+测试+原码)

前言 在双向链表之前&#xff0c;如果需要查看单链表来复习一下&#xff0c;链接在这里&#xff1a; http://t.csdnimg.cn/Ib5qS 1.双向链表 1.1 链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1.1.1 单向或者双向 1.1.2 …

技术精英求职必备:Android开发工程师简历制作全指南

简历编写核心原则 撰写针对安卓开发工程师职位的简历时&#xff0c;关键在于准确展示您在使用Android SDK进行应用开发、界面设计和性能优化方面的专业技能、项目经验和技术成就。简历应突出您的Android编程能力、对Kotlin和Java的熟练运用&#xff0c;以及在移动应用开发领域…