2015-05-14 113 views
-1

如何編寫進入文件夾子文件夾的程序?
我寫了一些代碼,但它沒有進入子文件夾。輸入所有子文件夾 - 遞歸

void main(int argc, char *argv[]) 
{ 
char* dirPath = argv[1]; 
struct stat statbuf; 
DIR *dir; 
struct dirent *ent; 
size_t arglen = strlen(argv[1]); 

if ((dir = opendir (dirPath)) != NULL) { 
    while ((ent = readdir (dir)) != NULL) { 
     printf(ent->d_name, "%s\n"); 
    } 
    closedir (dir); 
} else { 
    perror ("Problem"); 
    } 
} 

我試着遞歸使用stat()函數。

回答

0

http://www.lemoda.net/c/recursive-directory/

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <string.h> 
#include <errno.h> 
/* "readdir" etc. are defined here. */ 
#include <dirent.h> 
/* limits.h defines "PATH_MAX". */ 
#include <limits.h> 

/* List the files in "dir_name". */ 

static void 
list_dir (const char * dir_name) 
{ 
    DIR * d; 

    /* Open the directory specified by "dir_name". */ 

    d = opendir (dir_name); 

    /* Check it was opened. */ 
    if (! d) { 
     fprintf (stderr, "Cannot open directory '%s': %s\n", 
       dir_name, strerror (errno)); 
     exit (EXIT_FAILURE); 
    } 
    while (1) { 
     struct dirent * entry; 
     const char * d_name; 

     /* "Readdir" gets subsequent entries from "d". */ 
     entry = readdir (d); 
     if (! entry) { 
      /* There are no more entries in this directory, so break 
       out of the while loop. */ 
      break; 
     } 
     d_name = entry->d_name; 
     /* Print the name of the file and directory. */ 
    printf ("%s/%s\n", dir_name, d_name); 

#if 0 
    /* If you don't want to print the directories, use the 
     following line: */ 

     if (! (entry->d_type & DT_DIR)) { 
     printf ("%s/%s\n", dir_name, d_name); 
    } 

#endif /* 0 */ 


     if (entry->d_type & DT_DIR) { 

      /* Check that the directory is not "d" or d's parent. */ 

      if (strcmp (d_name, "..") != 0 && 
       strcmp (d_name, ".") != 0) { 
       int path_length; 
       char path[PATH_MAX]; 

       path_length = snprintf (path, PATH_MAX, 
             "%s/%s", dir_name, d_name); 
       printf ("%s\n", path); 
       if (path_length >= PATH_MAX) { 
        fprintf (stderr, "Path length has got too long.\n"); 
        exit (EXIT_FAILURE); 
       } 
       /* Recursively call "list_dir" with the new path. */ 
       list_dir (path); 
      } 
    } 
    } 
    /* After going through all the entries, close the directory. */ 
    if (closedir (d)) { 
     fprintf (stderr, "Could not close '%s': %s\n", 
       dir_name, strerror (errno)); 
     exit (EXIT_FAILURE); 
    } 
} 

int main() 
{ 
    list_dir ("/usr/share/games"); 
    return 0; 
} 
+0

謝謝!效果很好,但也許你知道它爲什麼在目錄路徑中打印「..」和「。」。 ? –

+1

如果您不想打印隱式目錄,則需要修改'/ *打印文件和目錄的名稱。 */ printf(「%s /%s \ n」,dir_name,d_name);' 檢查(而不是打印)這兩個。它在檢查執行下面的遞歸調用時執行此操作。它不能在這兩個目錄上遞歸調用該函數,否則它永遠不會終止。 – MuertoExcobito

0

另一個例子,使用文件樹的步行路程(ftwnftw) 這些都提供自己的回調funtion與struct stat的優勢,文件名和類型(FTW_D等)調用fnmatch以消除不需要的條目。以「。」開頭的文件是「隱藏文件」。 ls默認情況下不顯示它們。 ls -a將列出它們。

#include <sys/types.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <ftw.h> 

int callback(const char *fname, 
      const struct stat *st, 
      int type, 
      struct FTW *ftw) 
{ 
    // call fnmatch() here or use type to decide about printing 
    // printf file name and type , ??? on stat error FTW_NS, default to "????" 
    printf("%s\n", fname); 
    return 0; 
} 
int main(int argc, char **argv) 
{ 
    int fd_max=8; // max file desriptors 
    int retval=nftw((argc==1)?"." :argv[1], callback, fd_max, FTW_ANYERR); 
    return retval; 
} 
相關問題