2014-04-25 162 views
0

我需要在Windows上使用C創建一個簡單的目錄樹。然而,我的代碼不創建目錄,只是打印出來,和多數民衆贊成:在C,Windows,MinGW(CodeBlocks)代碼中創建目錄不會創建目錄

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <windows.h> 

void createDirTree(char *path) 
{ 
    char *tmp = NULL, *start = NULL, *end = NULL, *slash = NULL; 

    tmp = malloc(sizeof(char) * (strlen(path) + 1)); 
    strcpy(tmp, path); 

    start = tmp; 
    end = start + strlen(path); 

    while (start < end) 
    { 
     char *slash = strchr(start, '/'); 
     if (strcmp(start, ".") != 0) 
     { 
      CreateDirectory(tmp, NULL); 
      printf("going to make %s\n", tmp); 
     } 
     if (!slash) 
     { 
      break; 
     } 
     *slash = '/'; 
     start = slash + 1; 
    } 

    free(tmp); 
} 


int main() 
{ 
    char path1[] = "./mydir/dir1/dir2/"; 
    char path2[] = "./mydir/dir1/dir2/dir45/"; 
    createDirTree(path1); 
    createDirTree(path2); 
    return 0; 
} 
+2

第1步,始終檢查錯誤。當你調用'CreateDirectory'時,你會忽略這樣做。做到這一點,並找出哪裏出了問題。將診斷代碼添加到您的程序中,但卻無法向我們顯示輸出,這也是相當令人失望的。你可以看到。我們爲什麼要被拒絕? –

回答

0

一個問題是路徑的所有部分將被創建在同一目錄下(如果有的話創建)。一旦你已經創建的根目錄你不路徑的下一部分追加,你不進入新的目錄,這意味着一個路徑,如"some\\path\\with\\folders"創建層次結構:

 
\ 
`-- some 
    `-- path 
     `-- with 
      `-- folders 

相反,它創建

 
\ 
|-- some 
|-- path 
|-- with 
`-- folders 

但是,如果你沒有連得這棵樹,你應該檢查什麼CreateDirectory退貨。如果失敗,你需要檢查,並檢查錯誤是什麼。如果您執行的操作可能失敗,則應始終檢查失敗。

2

我沒有得到輸出一個期望:

while (start < end) 
{ 
    slash = strchr(start, '/'); 
    if (slash) *slash = 0; /* new line */ 

我得到如下:

createDirTree ("root/test/test2"); 

strchr後立即產生

going to make root/test/test2 
going to make root/test/test2 
going to make root/test/test2 

有了這個附加線路,更邏輯的輸出:

going to make root 
going to make root/test 
going to make root/test/test2 

當你下面就錯誤檢查CreateDirectory的建議:我想你可以放心地忽略,當你得到一個ERROR_ALREADY_EXISTS繼續。