2012-03-02 81 views
1

我希望有超過一百萬個具有唯一名稱的文件。我被告知,如果我把所有這些文件放在一個或兩個目錄中,這些文件的搜索速度將非常慢。所以我想出了以下目錄結構。如何在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<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): 0000005:訪問衝突寫入位置0x00be5898。

+1

在編寫更多代碼之前,您應該首先嚐試使用all-in-one-directory目錄,並查看它是否與所有這些一樣糟糕。您以後可以隨時升級到花哨的目錄層次結構。 – zmccord 2012-03-02 15:24:44

+1

一次創建一個目錄。 – 2012-03-02 15:32:45

+0

我無法這樣做,因爲我必須將可執行文件發送給超過一百人並收集這些文件。 – John 2012-03-02 15:33:34

回答

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

+0

我已經實現了你的僞代碼,但我得到了運行時錯誤 – John 2012-03-02 17:06:41

+0

@John,這是因爲你沒有分配任何內存,只使用字符串文字(「dir」)。這應該會更好。 – perreal 2012-03-02 17:25:59

+0

它停在dir \ 0 \ 0 \ 9 \ 9 – John 2012-03-02 17:38:05

1

不要這樣做:

sprintf(dir,"\%d",i);

  1. dir是一個const,re在您的示例中只有廣告字符串。
  2. 您可能會跑掉字符串的末尾,破壞內存中的內容。

不先複製到sdir而不先分配內存。

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

在功能make_dir結束,你將不得不調用free(sdir);這樣你就不會泄漏內存。