2013-04-01 120 views
0

我試圖遞歸地獲取目錄的所有文件和子文件夾。這是我到目前爲止。閱讀遞歸目錄

#include <iostream> 
#include "dirent.h" 
#include <io.h> 

using namespace std; 

void listDir(char *directory) 
{ 
    DIR *dir; 
    struct dirent *ent; 
    if((dir = opendir (directory)) != NULL) 
    { 
     while ((ent = readdir (dir)) != NULL) 
     { 
      if(strstr(ent->d_name,".") != NULL) 
       cout<<ent->d_name<<endl; 
      else 
      { 
       strcat(directory,ent->d_name); 
       strcat(directory,"\\"); 
       strcat(directory,"\0"); 
       cout<<directory<<endl; 
       cin.get(); 
       listDir(directory); 
      } 
     } 
    } 
    closedir (dir); 
} 

int main(int param, char **args) 
{ 
    char *path = new char[]; 
    path = args[1]; 
    strcat(path, "\\"); 
    listDir(path); 
    cin.get(); 
    return 0; 
} 

我使用的dirent(其實很酷,得到它,如果你不這樣做的話),當我得到遞歸似乎對我的子文件的末尾添加到目錄中的文件夾。例如:

下載,照片,幷包括是我Jakes625文件夾的所有子文件夾。也許我錯過了什麼?

+1

你有什麼問題? –

+0

這段代碼甚至沒有編譯:這個語句需要一個大小:''char * path = new char [];''爲什麼你不使用C++字符串? –

+1

爲什麼這個標籤C而不是C++?你正在使用'#include '所以它必須是C++,而不是C. –

回答

0
#include <unistd.h> 
#include <dirent.h> 

#include <iostream> 

using namespace std; 

void listDir(const string& path) 
{ 
    DIR *dir; 
    struct dirent *ent; 

    if((dir = opendir (path.c_str())) != NULL) 
    { 
    while ((ent = readdir (dir)) != NULL) 
    { 
     if(string(ent->d_name).compare(".") != 0) 
     { 
     cout<< ent->d_name << endl; 
     } 
     else 
     { 
     string nextDir = string(ent -> d_name); 
     nextDir += "\\"; 

     cout << nextDir << endl; 

     listDir(nextDir); 
     } 
    } 
    } 

    closedir (dir); 
} 

int main(int param, char **args) 
{ 
    string path = string(args[1]); 
    listDir(path); 

    return 0; 
} 

我重寫了它,以便它使用C++字符串:沒有理由在這裏使用C字符串。它現在有效。有一些小問題,但最重要的是當你去分配一個char數組時,你沒有指定一個大小。此行是罪魁禍首:

char *path = new char[]; // bad! 

如果不指定大小,則分配不知道有多少字節從堆中要求。你的程序不需要堆分配,因爲沒有數據需要超越其封閉詞法塊的情況。

+0

btw這段代碼仍然有很多錯誤,缺少很多必需的錯誤檢查。 –

+0

也可能需要'''#包括'''在某些平臺上。 –