程序设计:C++ 一个用目录结构构建索引的类

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        有时候可以利用文件系统目录结构对数据进行索引,将数据存储为小文件,避免在大文件里搜索。文件系统的目录结构本身是个树结构,相当于索引树,但每个目录下的文件数不能太多,因为目录下文件是遍历查找的,同时也不能太少,因为每个目录节点本身也要占用空间,海量目录占用空间巨大。

        本代码用字符串做key,若干个字节放一级目录(参数设置),如果设置为一个字节一级目录,那么key="123"的数据放置在“1/2/3/123.cache”文件里。

        代码如下:

	//快速文件索引,此结构本身可以放在共享内存
	class CFastFileInex
	{
	private:
		sstring<256> m_dir;//根目录
		long section;//几个字节一层目录,同一个目录下文件超过一定数量打开文件会很慢
	public:
		char const * GetRoot()const { return m_dir.c_str(); }
		string & toString(string & str)const
		{
			stringstream ss;
			ss << "dir[" << m_dir.c_str() << "]" << section;
			return str = ss.str();
		}
		void SetFastFileInex(char const * dir, long _section)
		{
			m_dir = dir;
			section = _section;
		}
		string & ffiGetFileName(unsigned long key, string & filename)const
		{
			char buf[256];
			sprintf(buf, "%lu", key);
			return ffiGetFileName(buf, filename);
		}
		string & ffiGetFileName(char const * key, string & filename)const
		{
			filename = m_dir.c_str();

			int len = strlen(key);
			long k = len / section;
			if (0 == len % section)--k;
			for (long i = 0; i < k; ++i)
			{
				for (long j = 0; j < section; ++j)	filename += key[i*section + j];
				filename += '/';
			}
			filename += key;
			filename += ".cache";
			return filename;
		}
		bool ffiReadFile(unsigned long key, CBuffer & buffer)const
		{
			char buf[256];
			sprintf(buf, "%lu", key);
			return ffiReadFile(buf, buffer);
		}
		bool ffiReadFile(char const * key, CBuffer & buffer)const
		{
			string filename;
			ffiGetFileName(key, filename);

			//打开失败再创建目录,再次打开失败才算失败
			CEasyFile file;
			if (!file.ReadFile(filename.c_str(), buffer))
			{
				CDir::CreateDir(filename.c_str());
				if (!file.ReadFile(filename.c_str(), buffer))
				{
					DEBUG_LOG << "打开文件出错 " << filename << " " << strerror(errno) << ende;
					return false;
				}
			}
			return true;
		}
		//读不到足够数据则失败
		bool ffiReadFile(long key, char * buffer, long buffersize)const
		{
			char buf[256];
			sprintf(buf, "%lu", key);
			return ffiReadFile(buf, buffer, buffersize);
		}
		//读不到足够数据则失败
		bool ffiReadFile(char const * key, char * buffer, long buffersize)const
		{
			string filename;
			ffiGetFileName(key, filename);

			//打开失败再创建目录,再次打开失败才算失败
			CEasyFile file;
			if (!file.ReadFile(filename.c_str(), buffer, buffersize))
			{
				CDir::CreateDir(filename.c_str());
				if (!file.ReadFile(filename.c_str(), buffer, buffersize))
				{
					DEBUG_LOG << "打开文件出错 " << filename << " " << strerror(errno) << ende;
					return false;
				}
			}
			return true;
		}
		bool ffiWriteFile(long key, char const * buffer, long buffersize)const
		{
			char buf[256];
			sprintf(buf, "%lu", key);
			return ffiWriteFile(buf, buffer, buffersize);
		}
		bool ffiWriteFile(char const * key, char const * buffer, long buffersize)const
		{
			string filename;
			ffiGetFileName(key, filename);

			//打开失败再创建目录,再次打开失败才算失败
			CEasyFile file;
			if (!file.WriteFile(filename.c_str(), buffer, buffersize))
			{
				CDir::CreateDir(filename.c_str());
				if (!file.WriteFile(filename.c_str(), buffer, buffersize))
				{
					DEBUG_LOG << "写入文件出错 " << filename << " " << strerror(errno) << ende;
					return false;
				}
			}
			return true;
		}
		bool ffiDeleteFile(long key)const
		{
			char buf[256];
			sprintf(buf, "%lu", key);
			return ffiDeleteFile(buf);
		}
		bool ffiDeleteFile(char const * key)const
		{
			string filename;
			ffiGetFileName(key, filename);

			//打开失败再创建目录,再次打开失败才算失败
			CEasyFile file;
			if (!file.DeleteFile(filename.c_str()))
			{
				DEBUG_LOG << "删除文件出错 " << filename << " " << strerror(errno) << ende;
				return false;
			}
			return true;
		}
	};

        里面用到的一些别的代码:

sstring 是个定长字符串模板类,替换成string就可以了

CDir 目录操作类,用到的函数的功能看名字就能理解了

CEasyFile 一个简单的文件接口类,用到的函数的功能看名字就能理解了


(这里是结束)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:实验八:数据排序

一、 实验目的 &#xff08;1&#xff09;掌握各种排序算法的过程和算法设计。 &#xff08;2&#xff09;体会各种排序算法的性能。 二、 实验要求 编写程序分别采用直接插入排序算法 、折半插入排序算法、冒泡排序算法、快速排序算法&#xff0c;实现对任意一组整型数据…

WEB攻防-.NET特性常见漏洞

目录 前置知识&#xff1a; DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例&#xff1a; 验证代码文件有没有可以绕过&#xff08;Cookie&Session&…

免费调用阿里云通义千问(qwen-1.8b-chat)大模型API

目录 前言通义千问开通注意 APi接口最后 前言 免费的GPT接口国内的使用一段实践就会失效&#xff0c;阿里云的qwen-1.8b-chat限时免费&#xff0c;可对接&#xff01;目前本账号小助手也是对接了该模型 通义千问 通义千问&#xff0c;是基于阿里巴巴达摩院在自然语言处理领域…

pytest测试基础

assert 验证关键字 需要pahton版本大于3.6&#xff0c;因为有个工具pip3;因为做了映射&#xff0c;所以下面命令pip3即pip pip install -U pytest -U参数可选&#xff0c;是如果已安装可更新。 如果上述demo变化 通过验证代码&#xff0c;测试环境没问题。…

服务器数据恢复—存储硬盘坏道,指示灯亮黄色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台某品牌EqualLogic PS系列某型号存储&#xff0c;存储中有一组由16块SAS硬盘组建的RAID5磁盘阵列&#xff0c;RAID5上划分VMFS文件系统存放虚拟机文件。存储系统上层一共分了4个卷。 raid5阵列中磁盘出现故障&#xff0c;有2块硬盘…

关于远程桌面端口的优化措施的建议

在信息技术的世界中&#xff0c;远程桌面连接已成为企业、教育和个人用户之间共享信息、协作工作的重要工具。而这一切的背后&#xff0c;都离不开远程桌面端口&#xff08;RDP&#xff0c;Remote Desktop Protocol Port&#xff09;的支持。RDP端口不仅关乎到远程访问的顺畅性…

RK3568 学习笔记 : busybox 制作 ext4最小根文件系统

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 VMware 虚拟机 ubuntu 20.04 编译 busybox&#xff0c;并制作 emmc 中的 ext4 根文件系统 rootfs 下载 busybox 可以在 https://busybox.net/downloads/snapshots/ 下载最新的 busybox&#xff…

蓝桥杯——分巧克力

思路非常简单&#xff0c;就是一个二分法。 注意一下l和r的取值&#xff0c;就可以了。 // 如何进行切分巧克力&#xff1a;横纵除法。例如&#xff1a;一块6*5的&#xff0c;欲切为3*3的小块&#xff0c;横&#xff1a;6/2 3&#xff1b;纵&#xff1a;5/31.所以可以切成3*…

学习100个Unity Shader (15) ---透明+双面渲染

文章目录 效果shader理解参考 效果 shader Shader "Example/AlphaBlendBothSided" {Properties{_Color ("Main Tint", Color) (1, 1, 1, 1)_MainTex ("Texture", 2D) "white" {}_AlphaScale ("Alpha Scale", Range(0, 1)…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…

基于Amazon Bedrock打造Claude3 Opus智能助理

近期&#xff0c;Anthropic 发布了其最新的大模型 Claude3。截止本文撰写时&#xff0c;Claude3 Opus、Claude3 Sonnet、Claude3 Haiku 均已在 Amazon Bedrock 可用&#xff0c;随着 Amazon Bedrock 可提供越来越多的大模型&#xff0c;您可以在您的应用场景里将其落地&#xf…

Pytorch GPU版本安装

一、背景 记录一下安装Pytorch GPU版本过程。 由于手残&#xff0c;卸载了电脑上的显卡驱动&#xff0c;现在我连显卡类型是啥都不知道了。 总体思路&#xff1a;安装显卡驱动->安装cuda->安装pytorch库 二、安装显卡驱动 2.1 查看本地显卡型号 通过「DirectX 诊断工具…

详细谈电脑ip、域名、内网、外网、localhost、127.0.0.1、网关等通讯基础知识(易懂)

1. ip地址与域名的定义以及其关系 ip地址的定义&#xff1a; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一…

YAW-100B全自动压力试验机

一、简介 微机控制压力试验机测控系统采用高精度数字伺服阀&#xff0c;具有力闭环控制功能&#xff0c;能够实现等载荷速率加载或等应力速率加载&#xff0c;控制精度高&#xff0c;可靠性好&#xff0c;完全满足GB/T 17617《水泥胶沙强度检验方法&#xff08;ISO方法&#x…

2024五一劳动节海外网红营销指南:策略、内容与互动全解析

随着全球化的推进和互联网的普及&#xff0c;海外网红营销已经成为越来越多品牌扩大影响力、提升销售额的重要手段。而即将到来的2024年五一劳动节&#xff0c;也成为了品牌们争相推出营销活动的重要节点。本文Nox聚星将和大家从策略、内容和互动三个方面&#xff0c;解析如何利…

【C#】.net core 6.0 MVC返回JsonResult显示API接口返回值不可被JSON反序列化

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景API接口接口代码请求失败原因排查调通效果 常见返回类型相关文章 …

YOLO-yolov5构建数据集

1.收集数据集 创建一个dataset文件夹用来存放图片数据集。 我这里使用的图片数据集&#xff0c;是对一段视频进行抽帧得到的200张狗狗图片。 在dataset文件夹下新建images和labels文件夹&#xff0c;并将200张狗狗图片放入images中。 2.标注数据集 2.1安装标注工具labelimg…

Redis(单/多)线程

一、 Redis 单线程 与 多线程 怎么说&#xff1f; &#xff08;1&#xff09;重要的版本迭代 redis4 之前仅支持 单线程&#xff0c; redis 4之后慢慢 支持多线程&#xff0c; 直到redis6/7后才稳定 &#xff08;2&#xff09;redis 的 工作线程 是 单线程的 &#xff08…

MyBatis-Plus笔记——基础环境搭建

Spring 基础环境 Spring 基础环境 指的是 Spring MyBatis 辅助类 1.引入依赖 <properties> <maven.compiler.source>22</maven.compiler.source> <maven.compiler.target>22</maven.compiler.target> <project.build.sourceEncoding>…

Java-字符-charbyteASCII

1 需求 需求&#xff1a;ASCII表需求&#xff1a;打印 ASCII表需求&#xff1a;ASCII表 分类需求&#xff1a;ASCII表 中 常见字符需求&#xff1a;ASCII表 中 正则相关字符 2 接口 3.X ASCII表 参考资料&#xff1a; https://www.cnblogs.com/amosli/p/3832817.html 3.X 打印…