專案中需要遍歷目錄並對目錄下的所有檔案進行處理分析,於是先實現一下遍歷目錄的功能
實現程式碼:
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