如何在c中为以下要求创建递归目录?
我希望有超过一百万个具有唯一名称的文件。 有人告诉我,如果我将所有这些文件放在一个或两个目录中,这些文件的搜索速度将非常慢。 所以我想出了以下目录架构。
我希望目录结构分支出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 #include #include 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)的未处理exception:0xC0000005:访问冲突写入位置0x00be5898。
一种伪代码,但可以这样做:
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);
不要这样做:
的sprintf(DIR, “\%d”,i)的;
-
dir
是示例中的const,只读字符串。 - 你很可能会跑掉字符串的末尾,破坏内存中跟随它的东西。
不先分配内存,不要复制到sdir。
sdir =(char *)malloc(strlen(dir)+ 1);
在函数make_dir
,你必须调用free( sdir );
所以你不要泄漏内存。