插件开发技术说明(15)---文件自动分目录存储

1.说明

用途:

.当文件数量很大,在单一目录下时无法容纳,需要把文件自动分散到不同的目录下.


特性:
.指定一个$HOME目录,可限定每个目录下最多文件数量
.分级目录保存,如$HOME\1,$HOME\2.在$HOME\1下再分目录保存,以保证可容纳足够数量的文件.
   按每个目录最大文件数2000个计算,3级可存储的文件数为:2000*2000*2000个文件
.文件名:外部指定,文件名重复时覆盖
.并行考虑:多进程或多线程的情况下,不同进程设置不同的输出目录:如把$HOME\1,$HOME\2分配给不同的进程。
   其中,1,2作为域。输出文件设置主目录外,每个进程指定一个输出域。
   
 

2.实现 

 
/
/// 目录层级信息
struct CDirLevelInfo {
	unsigned int num_; ///< 目录(或文件)个数
	unsigned int max_id_; ///< 最大id 
public:
	CDirLevelInfo():num_(0),max_id_(0) {
	}
};
/
class LS_API CFileStorageDisperser {
	int DetermineLastOutputPath(); ///< 上次最后输出路径信息.仅服务器启动时调用
	int OutputFile_i(const char *fn,unsigned char *buf,unsigned long len);
	int DetermineOutputPath(); ///< 确定当前输出路径
	< 取目录下子目录个数,最大目录id
	unsigned int GetSubDir(string &dir,unsigned int &num,unsigned int &max_id);
	///< flag=1:文件数 flag=2目录数
	unsigned int GetDirFileNum(string &dir,int flag); ///< 检查目录下文件数

	void SetFileNumLimit(unsigned long max_num) { max_file_num_ = max_num; }

	CDirLevelInfo *dli_; ///< 目录层级信息
public:
	string root_path_; ///< 主路径
	unsigned long cur_file_num_; ///< 当前文件目录下文件数
	unsigned long max_file_num_; ///< 每目录最大文件个数
	unsigned short dir_level_; ///< 子目录级数

	ACE_Thread_Mutex mutex_; ///< 
public:
	CFileStorageDisperser();
	~CFileStorageDisperser();

	int SetRootPath(string &path,unsigned int max_num=2000); 
	string& GetRootPath() { return root_path_; }
	void SetDirLevel(unsigned short num);

	int OutputFile(const char *fn,unsigned char *buffer,unsigned int len,string *path_file); ///< 输出文件
};


3.测试代码

	CFileStorageDisperser fsd;
//	fsd.SetDirLevel(2); ///< 设置目录级数为2级
	string root = "filehome\\test_pic";
	fsd.SetRootPath(root,2); ///< 每个目录下最多2个文件

	int file_num=40; ///< 创建40个文件
	unsigned long len = 10;
	unsigned char *buffer = new unsigned char[len];

	for (int i=0;i<file_num;i++) {
		char file_name[256];
		sprintf(file_name,"pic%d",i+1);
		fsd.OutputFile(file_name,buffer,len);
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值