c - 我如何在 c 中为以下要求创建递归目录?

标签 c visual-c++ recursion directory

我希望有超过一百万个具有唯一名称的文件。有人告诉我,如果我将所有这些文件放在一个或两个目录中,这些文件的搜索速度将非常慢。所以我想出了以下目录架构。

我希望目录结构分支出 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);

如何创建这些目录?

编辑:

所有文件都是文本文件。 该程序将分发给许多人,以便为研究收集信息。所以 tt 像这样创建这些文件很重要。

编辑:

我创建了以下代码来实现 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;
}

Unhandled exception at 0x5b9c1cee (msvcr100d.dll) in mkdir.exe: 0xC0000005: Access violation writing location 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);

关于c - 我如何在 c 中为以下要求创建递归目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9535754/

相关文章:

c - 使堆栈指针指向 mmap 返回的指针。 (Linux,32 位虚拟机)

php - 为什么 strtolower 比 strtoupper 稍慢?

c++ - 从 size_t 到 wchar_t 的转换需要缩小转换

vb.net - 递归函数不遵循所有路径

linq - 递归地 (?) 将 LINQ 谓词组合成单个谓词

java - 为什么我会收到 NoSuchElementException?

c - 如何将长无符号转换为无符号char *?

c - 将 MIPS 汇编语言转换为 C 语言

c++ - 无法使用 qlogvalueaxis.h 编译 Qt 项目

c++ - 针对自定义构建的 tcl85.lib 的链接器错误,适用于 ActiveState 分发的 tcl85.lib