【问题标题】:how do i create recursive directories for the following requirement in c?如何在 c 中为以下要求创建递归目录?
【发布时间】:2012-03-21 02:25:53
【问题描述】:

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

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

mkdir.exe 中 0x5b9c1cee (msvcr100d.dll) 处未处理的异常: 0xC0000005:访问冲突写入位置0x00be5898。

【问题讨论】:

  • 在编写更多代码之前,您可能应该先尝试一体化目录,看看它是否与所有这些一样糟糕。您以后可以随时升级到花哨的目录层次结构。
  • 一次创建一个目录。
  • 我不能这样做,因为我必须将可执行文件发送给一百多人并收集这些文件。

标签: c visual-c++ recursion directory


【解决方案1】:

一种伪代码,但可以这样做:

 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);

【讨论】:

  • 我已经实现了你的伪代码,但是我得到了运行时错误
  • @John,这是因为您没有分配任何内存并且仅使用字符串文字(“dir”)。这应该会更好。
  • @John,在创建任何目录之前检查目录是否存在。
  • @John,特别是如果目录尚未创建,则仅进行第一次 CreateDirectoryA 调用,但如果存在则不存在该函数。
  • 它仍然无法正常工作。尝试释放 sdir 时出现堆损坏 free(sdir); 你成功运行了吗?
【解决方案2】:

不要这样做:

sprintf(dir,"\%d",i);
  1. dir 在您的示例中是一个 const 只读字符串。
  2. 您可能会跑出字符串的末尾,从而破坏内存中跟随它的内容。

先分配内存,不要复制到sdir。

sdir = (char *)malloc(strlen(dir) + 1);

在函数make_dir 结束时,您必须调用free( sdir );,以免内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-08
    • 2014-01-03
    • 2011-04-10
    • 2011-10-10
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多