linux下遍歷目錄

weixin_34015860發表於2014-10-28

專案中需要遍歷目錄並對目錄下的所有檔案進行處理分析,於是先實現一下遍歷目錄的功能

實現程式碼:

 1 #include <unistd.h>
 2 #include <dirent.h>
 3 #include <iostream>
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <string.h>
 7 #include <sys/stat.h>
 8 
 9 using namespace std;
10 
11 void traverseDir(char *pPath, int nDeepth);
12 
13 int main(int argc, char **argv)
14 {
15     for (int i = 1; i < argc; ++i)
16     {
17         traverseDir(argv[i], 0);
18     }
19 
20     return 0;
21 }
22 
23 void traverseDir(char *pPath, int nDeepth)
24 {
25     DIR *pDir = NULL;
26     struct dirent *pSTDirEntry;
27     char *pChild = NULL;
28 
29 
30     if ((pDir = opendir(pPath)) == NULL)
31     {
32         return ;
33     }
34     else
35     {
36         while ((pSTDirEntry = readdir(pDir)) != NULL)
37         {
38             if ((strcmp(pSTDirEntry->d_name, ".") == 0) || (strcmp(pSTDirEntry->d_name, "..") == 0))
39             {
40                 continue;
41             }
42             else
43             {
44                 for (int i = 0; i < nDeepth; i++)
45                 {
46                     cout << "\t";
47                 }
48                 cout << pSTDirEntry->d_name << endl;
49 
50                 if (pSTDirEntry->d_type & DT_DIR)
51                 {
52                     pChild = (char*)malloc(sizeof(char) * (NAME_MAX + 1));
53                     if (pChild == NULL)
54                     {
55                         perror("memory not enough.");
56                         return ;
57                     }
58                     memset(pChild, 0, NAME_MAX + 1);
59                     strcpy(pChild, pPath);
60                     strcat(pChild, pSTDirEntry->d_name);
61                     traverseDir(pChild, nDeepth + 1);
62                     free(pChild);
63                     pChild = NULL;
64                 }
65             }
66         }
67         closedir(pDir);
68     }
69 }

此程式碼僅僅實現了遍歷的功能,輸出介面美觀性沒有考慮,而且也不太健壯,比如執行以下命令:

1 ./Dir ../
2 ./Dir ..

第二行的就無法遞迴遍歷資料夾,因為沒有對路徑結尾的/做處理。

使用到的函式是opendir、readdir、closedir,還有結構體dirent以及DIR

沒有什麼太難的地方,只是有一點需要注意,判斷一個路徑是不是目錄應該使用pSTDirEntry->d_type & DT_DIR 判斷相與的值是否等於零,不等於0則為目錄

 

參考:http://blog.csdn.net/pengqianhe/article/details/8567955

相關文章