0289-KVS-读取目录中的文件

news/2025/10/28 17:18:36/文章来源:https://www.cnblogs.com/jiangbo4444/p/19172311

环境

  • Time 2022-12-16
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://github.com/pingcap/talent-plan

目标

在上一节的基础上,根据提供的目录,到目录中进行文件的读取。

Cargo.toml

[package]
edition = "2021"
name = "kvs"
version = "1.0.0"[dependencies]
clap = {version = "4", features = ["derive"]}
serde = {version = "1", features = ["derive"]}
serde_json = "1"

log.rs

use std::collections::BTreeMap;
use std::path::Path;use crate::cmd::{Command, Index};use self::{reader::PosBufReader, writer::PosBufWriter};mod reader;
mod writer;pub struct CommandLog {reader: PosBufReader,writer: PosBufWriter,index: Index,
}pub type KvResult = anyhow::Result<Option<String>>;impl CommandLog {pub fn new() -> anyhow::Result<Self> {let path = Path::new("/root/log");let writer = PosBufWriter::new(path)?;let mut index = BTreeMap::default();let mut reader = PosBufReader::new(path)?;reader.load(&mut index)?;Ok(Self {reader,writer,index,})}pub fn get(&mut self, key: &str) -> KvResult {self.reader.read(self.index.get(key))}pub fn set(&mut self, key: String, value: String) -> KvResult {let result = self.reader.read(self.index.get(&key));let command = Command::Set {key: key.to_string(),value,};let json = serde_json::to_string(&command)?;let position = self.writer.write(json.as_bytes())?;self.index.insert(key, position);result}pub fn remove(&mut self, key: String) -> KvResult {let result = self.reader.read(self.index.get(&key));let command = Command::Remove {key: key.to_string(),};let json = serde_json::to_string(&command)?;self.writer.write(json.as_bytes())?;self.index.remove(&key);result}
}

reader.rs

use std::ffi::OsStr;
use std::fs::{File, OpenOptions};
use std::io::{BufReader, Read, Seek, SeekFrom};
use std::path::{Path, PathBuf};use serde_json::Deserializer;use crate::cmd::{Command, CommandPosition, Index};use super::KvResult;pub struct PosBufReader {reader: BufReader<File>,
}impl PosBufReader {pub fn new(path: &Path) -> anyhow::Result<PosBufReader> {let number = *sorted_gen_list(path)?.first().unwrap();let path = path.join(format!("{}.log", number));let file = OpenOptions::new().read(true).open(&path)?;let reader = BufReader::new(file);Ok(Self { reader })}pub fn load(&mut self, map: &mut Index) -> anyhow::Result<()> {let reader = &mut self.reader;let mut old = reader.seek(SeekFrom::Start(0))? as usize;let mut stream = Deserializer::from_reader(reader).into_iter();while let Some(cmd) = stream.next() {let new = stream.byte_offset();match cmd? {Command::Set { key, .. } => {map.insert(key, CommandPosition::new(old, new - old));}Command::Remove { .. } => (),};old = new;}Ok(())}pub fn read(&mut self, position: Option<&CommandPosition>) -> KvResult {let position = match position {Some(position) => position,None => return Ok(None),};self.reader.seek(SeekFrom::Start(position.pos as u64))?;let command = (&mut self.reader).take(position.len as u64);match serde_json::from_reader(command)? {Command::Set { value, .. } => Ok(Some(value)),_ => unreachable!(),}}
}fn sorted_gen_list(path: &Path) -> anyhow::Result<Vec<u64>> {let mut list: Vec<u64> = path.read_dir()?.flat_map(|res| res.map(|entry| entry.path())).filter(|path| path.is_file()).flat_map(file_name_to_number).collect();list.sort_unstable();Ok(list)
}fn file_name_to_number(path: PathBuf) -> Option<u64> {let name = path.file_name().and_then(OsStr::to_str)?;match name.ends_with(".log") {false => None,true => name.trim_end_matches(".log").parse().ok(),}
}

writer.rs

use std::fs::{File, OpenOptions};
use std::io::{BufWriter, Seek, SeekFrom, Write};
use std::path::Path;use crate::cmd::CommandPosition;pub struct PosBufWriter {writer: BufWriter<File>,pos: usize,
}impl PosBufWriter {pub fn new(path: &Path) -> anyhow::Result<Self> {let path = path.join("1.log");let file = OpenOptions::new().append(true).create(true).open(path)?;let mut writer = BufWriter::new(file);let pos = writer.seek(SeekFrom::End(0))? as usize;Ok(Self { writer, pos })}pub fn write(&mut self, buf: &[u8]) -> anyhow::Result<CommandPosition> {let result = CommandPosition::new(self.pos, buf.len());self.writer.write_all(buf)?;self.writer.flush()?;self.pos += result.len;Ok(result)}
}

总结

根据提供的目录,到目录中读取文件,然后将文件中的内容加入到索引中。

附录

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

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

相关文章

0288-KVS-根据索引读取文件

环境Time 2022-12-13 WSL-Ubuntu 22.04 Rust 1.65.0前言 说明 参考:https://github.com/pingcap/talent-plan 目标 在上一节的基础上,根据提供的索引,到文件中读取命令和值。 Cargo.toml [package] edition = "…

2025年南京机械钻井工程服务权威推荐榜单:砖井工程/打桩工程/环保检测井工程源头公司精选

在城市建设与环保政策双轮驱动下,南京机械钻井工程服务市场正迎来新一轮发展机遇,其中环保检测井工程已成为增长新引擎。 在当今城市基础设施更新和环保政策深入推进的背景下,南京机械钻井工程服务行业依托区域经济…

如何在 Mac 上恢复已删除的文件:解决方案和预防技巧

在 Mac 上删除文件并不意味着一切就此结束。如今,macOS 用户有多种方法可以恢复已删除的数据。即使文件已从 Mac 的“垃圾箱”中删除,您仍然可以选择其他方法。您可以使用 macOS 的内置功能进行数据恢复,也可以使用…

GMT0009 SM2密钥算法使用规范

原文链接:https://blog.csdn.net/A_CAT_journey/article/details/1393903021、什么是国密密钥对加密 国密密钥对加密格式定义在《GMT 0009-2012 SM2密码算法使用规范》文档中,具体的规范格式如下:在SM2密钥对传递时…

2025精密/五金/冲压/塑料/模具配件/司筒/镶件/零件企业推荐榜:锦鸿深耕三十载筑服务网络,这些实力派值得关注​

在有着 “全球模具产业之都” 之称的东莞,模具配件作为 “工业之母” 的核心支撑,正随产业升级不断突破。2025 年市场需求持续向高精度、快响应倾斜,以下几家模具配件企业凭借技术积淀与服务能力脱颖而出。​ 东莞市…

2025发泡混凝土领域厂家推荐榜:云南锦乐建筑领衔,多企业助力绿色建材发展​ 随着

随着绿色建筑理念的普及,兼具轻质、保温、隔音与环保特性的发泡混凝土,在民用建筑、市政配套等领域的需求持续增长。为展现该领域优质企业实力,本次 2025 发泡混凝土领域推荐榜聚焦云南区域,结合企业业务专注度、技…

2025年泳池水循环设备厂家权威推荐榜单:泳池水净化设备 /钢结构泳池/泳池恒温设备源头厂家精选

随着全民健身战略的深入实施和人们对健康生活品质要求的提升,泳池水循环设备行业正迎来新一轮发展机遇。 据中国水处理行业协会统计数据显示,2024年中国泳池水处理设备市场规模已达86亿元人民币,预计到2027年将突破…

EasyExcel碰到问题记录

1、富文本中文字设置不同颜色和字体不生效String stringCellValue = cell.getStringCellValue();if (StringUtils.isNotBlank(stringCellValue) && stringCellValue.contains(startIndex) && stringCe…

2025年修护/二硫化硒去屑/香氛/控油蓬松/洗发水推荐榜:西安悦己容生物主打植萃护理,四大品牌以精准配方适配多元发质

随着消费者对发质护理的需求从 “基础清洁” 转向 “针对性修护”,植萃成分、无刺激配方、细分发质适配成为洗发水市场核心竞争点。基于成分安全性、使用体验与用户口碑,2025 年洗发水领域优质企业推荐如下:​ 西安…

2025喷涂/聚脲涂料领域源头厂家推荐榜:宁国创遂新材料领衔,多企业助力防腐防护升级​

在工业设备防腐、建筑防水、交通设施耐磨等场景中,聚脲涂料因具备快速固化、高弹性、耐候性强等优势,成为材料领域的重要选择。为展现聚脲涂料领域优质企业实力,本次 2025 推荐榜聚焦安徽区域,结合企业技术专业性、…

2025弯管领域源头厂家推荐榜:合肥市翼达机械领衔,多企业助力工业管件加工升级​

在汽车制造、暖通工程、家电生产等工业领域,弯管作为关键管件,其精度、材质适配性与加工效率直接影响下游产品性能。为展现弯管领域优质企业实力,本次 2025 弯管领域推荐榜聚焦安徽区域,结合企业技术专业性、产品适…

2025不锈钢剪板折弯推荐榜:上海一步一金属主打定制加工,四大企业以精准工艺赋能工业制造

随着机械制造、装饰工程等领域对不锈钢构件精度要求的提升,不锈钢剪板折弯作为关键加工环节,其工艺精度、定制化能力与交付效率成为企业竞争核心。基于加工质量、行业适配性与客户口碑,2025 年不锈钢剪板折弯领域优…

2025年碳氢肥料生产厂家权威推荐榜单:农产品用料/增产用肥/碳氢核肥邮沃源头厂家精选

在生态农业与绿色肥料需求日益增长的今天,碳氢肥料作为一种利用二氧化碳资源的新型肥料,正成为农资市场的热门选择。 随着国家“双碳”政策的深入推进和生态农业理念的普及,碳氢肥料市场近年来呈现出显著的增长态势…

算法分析--分治--3.矩阵乘法

1.1 题目描述 输入的第一行中有3个整数n, m,k,表示A矩阵是n行m列,B矩阵是m行k列。接下来的n行,每行m个数字,表示矩阵A中的元素。接下来的m行,每行k个元素,表示矩阵B中的元素。 【样例输入】 3 2 3 1 1 1 1 1 1 1 1…

三立轴承:精密轴承安装后怎么检查?

数控机床、加工中心对主轴轴承的要求高,通常要配置P5、P4级别的精密轴承,但有时候运行效果不理想,往往排查下来是安装不到位引起的。精密轴承不仅自身质量要过关,同时安装过程也很重要,三立轴承建议装完之后要仔细…

2025年灭火装置厂家推荐排行榜,气体灭火装置,自动灭火装置,机床灭火装置,七氟丙烷灭火装置,二氧化碳灭火装置,清洗机灭火装置,走心机灭火装置,搓丝机灭火装置,磨床灭火装置,火花机灭火装置公司推荐

2025年灭火装置厂家推荐排行榜:专业选购指南与权威品牌分析 行业背景与发展趋势 随着工业自动化程度的不断提高,各类精密加工设备在生产过程中的火灾风险日益凸显。灭火装置作为工业安全的重要保障,其技术水平和产品…

CF2038B Make It Equal

首先感受一下不难发现可以二分 \(p\)。 现在相当于要进行操作使得所有数都变为 \(p\),比较暴力的做法是从 \(1\) 开始,如果比 \(p\) 打就一直减,然后递推到下一项,如果递推完了再回到第一项,可以证明递推的次数比…

2025年高温线缆优质厂家盘点:实力派企业守护工业核心需求,铁氟龙高温线,硅胶高温线,高压高温线厂家推荐

在工业制造、新能源、航空航天等领域,高温线缆作为保障设备稳定运行的关键部件,其耐温性能、绝缘强度与使用寿命直接关系到生产安全与效率。经过对行业资质、技术实力、市场口碑等多维度调研,值得关注的高温线缆厂家…

my.conf脚本备份

✅ 修正版配置备份脚本 文件路径建议放在: /mnt/sdc/backup/mysql_backup.sh 内容如下: #!/bin/bash # ========================================== # 名称:配置文件备份脚本 # 说明:定期备份 bfm 应用 JAR 包 # …

详细介绍:SQL中的CTE(公用表表达式)完全指南:从入门到精通

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …