我希望有超过一百万个具有唯一名称的文件。有人告诉我,如果我将所有这些文件放在一个或两个目录中,这些文件的搜索速度将非常慢。所以我想出了以下目录架构。
我希望目录结构分支出10个子目录,子目录的级别将是4.因为文件名保证是唯一的我想使用这些文件名来制作可用于哈希的哈希将文件放在目录中,稍后再找到它。随机哈希值将使目录具有大约1,000个文件。
因此,如果F是根目录,那么插入或搜索文件将必须执行以下步骤:
我想使用0-9中的数字作为目录名
h=hash(filename)
sprintf(filepath,"f//%d//%d//%d//%d//.txt",h%10,h%10,h%10,h%10);
我如何创建这些导演?
编辑:
所有文件都是文本文件。 该计划将分发给许多人,以收集研究信息。因此,重要的是这些文件是这样创建的。
编辑:
我创建了以下代码来实现 perreal的伪代码。它编译成功但会给出最后给出的运行时错误。
错误发生在sprintf()
行。
#include<iostream>
#include<stdlib.h>
#include<windows.h>
void make_dir(int depth, char *dir) {
if (depth < 4) {
if (! CreateDirectoryA (dir,NULL))
for (int i = 0; i < 10; i++) {
sprintf(dir,"\\%d",i);
char *sdir=NULL ;
strcpy(sdir,dir);
CreateDirectoryA(sdir,NULL);
make_dir(depth + 1, sdir);
}
}
}
int main()
{
make_dir(0,"dir");
return 1;
}
mkdir.exe中0x5b9c1cee(msvcr100d.dll)的未处理异常: 0xC0000005:访问冲突写入位置0x00be5898。
答案 0 :(得分:2)
有点伪代码,但可以这样做:
void make_dir(int depth, char *dir) {
if (depth < 4) {
CreateDirectoryA (dir,NULL);
for (int i = 0; i < 10; i++) {
char *sdir= (char*)malloc(strlen(dir+10)); // XXX 10?
strcpy(sdir, dir);
sprintf(sdir + strlen(sdir), "\\%d", i);
printf("%s\n", sdir);
//CreateDirectoryA(sdir,NULL);
make_dir(depth + 1, sdir);
free(sdir);
}
}
}
}
并致电make_dir(0, rootdir);
答案 1 :(得分:1)
不要这样做:
sprintf(dir,"\%d",i);
dir
是示例中的const,只读字符串。不先分配内存,不要复制到sdir。
sdir = (char *)malloc( strlen( dir ) + 1 );
在函数make_dir
结束时,您必须调用free( sdir );
,这样才不会泄漏内存。