Как создать рекурсивные каталоги для следующего требования в c? - PullRequest
1 голос
/ 02 марта 2012

я ожидаю иметь более миллиона файлов с уникальными именами. Мне сказали, что если я помещу все эти файлы в одну или две директории, скорость поиска этих файлов будет очень низкой. Итак, я придумал следующую архитектуру каталогов.

Я хочу, чтобы структура каталогов разветвлялась на 10 подкаталогов, а уровень подкаталогов будет равен 4. Поскольку имена файлов гарантированно уникальны, я хочу использовать эти имена файлов для создания хэшей, которые можно использовать для положить файл в каталог, а также позже, чтобы найти его. Случайные значения хеша сделают каталог, в котором будет приблизительно 1000 файлов.

, поэтому, если F является корневым каталогом, то для вставки или поиска файла необходимо выполнить следующие шаги:

Я хочу использовать числа от 0 до 9 в качестве имен каталогов

h=hash(filename)
sprintf(filepath,"f//%d//%d//%d//%d//.txt",h%10,h%10,h%10,h%10);

КАК СОЗДАТЬ ЭТИ СПРАВОЧНИКИ?

EDIT:

Все файлы являются текстовыми файлами. Программа будет распространена среди многих людей с целью сбора информации для исследования. Поэтому важно, чтобы эти файлы создавались следующим образом.

EDIT:

я создал следующий код для реализации perreal's псевдокода. Он компилируется к успеху, но выдает ошибку времени выполнения, указанную в конце. ошибка возникает в строке 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;
}

Необработанное исключение в 0x5b9c1cee (msvcr100d.dll) в mkdir.exe: 0xC0000005: Место записи нарушения прав доступа 0x00be5898.

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Вид псевдокода, но можно сделать так:

 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 голос
/ 02 марта 2012

Не делайте этого:

sprintf(dir,"\%d",i);
  1. dir - это const, строка только для чтения в вашем примере.
  2. Скорее всего, вы запустите конец строки, испортив в памяти то, что следует за ней.

Не копировать в sdir без предварительного выделения памяти.

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

В конце функции make_dir вам придется вызвать free( sdir );, чтобы не допустить утечки памяти.

...