色偷偷91综合久久噜噜-色偷偷成人-色偷偷尼玛图亚洲综合-色偷偷人人澡久久天天-国内精品视频一区-国内精品视频一区二区三区

Hello! 歡迎來到小浪云!


如何用copendir實現遞歸目錄遍歷


avatar
小浪云 2025-03-11 43

如何用copendir實現遞歸目錄遍歷

opendir 函數本身無法實現遞歸目錄遍歷,需要結合 readdir、closedir 和 stat (或 lstat 避免符號鏈接問題) 函數,并使用遞歸調用來實現。以下是一個改進的 C 語言示例,它能夠更穩健地處理目錄遍歷,包括符號鏈接:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <limits.h>  // for PATH_MAX   void list_directory_contents(const char *path) {     DIR *dir;     struct dirent *entry;     struct stat path_stat;     char full_path[PATH_MAX];       dir = opendir(path);     if (!dir) {         perror("opendir");         return;     }      while ((entry = readdir(dir)) != NULL) {         if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {             continue;         }          // 使用 snprintf 避免緩沖區溢出         if (snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name) >= sizeof(full_path)) {             fprintf(stderr, "Path too long: %s/%s ", path, entry->d_name);             continue;         }           if (lstat(full_path, &path_stat) == -1) { // 使用 lstat 處理符號鏈接             perror("lstat");             continue;         }          if (S_ISDIR(path_stat.st_mode)) {             list_directory_contents(full_path);         } else if (S_ISREG(path_stat.st_mode)) { // 只打印常規文件             printf("%s ", full_path);         } else if (S_ISLNK(path_stat.st_mode)) {             printf("Symbolic link: %s ", full_path); // 處理符號鏈接         } else {             printf("Other file type: %s ", full_path); // 處理其他文件類型         }     }      closedir(dir); }  int main(int argc, char *argv[]) {     if (argc != 2) {         fprintf(stderr, "Usage: %s <directory> ", argv[0]);         return EXIT_FAILURE;     }      list_directory_contents(argv[1]);     return EXIT_SUCCESS; }

此版本改進之處:

  • 錯誤處理: 更全面的錯誤處理,包括 opendir 和 lstat 的錯誤檢查。
  • 路徑長度限制: 使用 snprintf 來防止潛在的緩沖區溢出,避免路徑過長導致程序崩潰。
  • 符號鏈接處理: 使用 lstat 代替 stat,可以正確處理符號鏈接,避免無限遞歸
  • 文件類型區分: 區分常規文件和其他文件類型,例如符號鏈接,提供更詳細的信息。

這個程序仍然假設 PATH_MAX 是定義的,在某些系統中可能需要包含額外的頭文件或使用其他方法來獲取最大路徑長度。 記住編譯時需要鏈接 -lm (如果你的系統需要)。 例如:gcc your_file.c -o your_program -lm

相關閱讀

主站蜘蛛池模板: 国内精品综合九九久久精品 | 一级黄色毛片播放 | 一级国产精品一级国产精品片 | 免费看黄色影片 | 精品久久久久久久一区二区伦理 | 天天爱天天干天天 | 国产精品免费看久久久麻豆 | 久久久精品2019中文字幕2020 | 人人爽人人香蕉 | 国产99re在线观看只有精品 | 久久久免费精品视频 | 老司机成人免费精品视频 | 一级毛片子 | 久久免费精品国产72精品剧情 | 国产一区二区三区在线观看精品 | 玖玖操| 国产福利一区二区在线观看 | 狠狠色狠狠综合久久 | 日日操夜夜操狠狠操 | 麻豆久久久久久久 | 在线一级毛片 | 婷婷午夜激情 | 国内自拍视频在线播放 | 天天综合日日噜噜噜 | 国内精品日本久久久久影院 | 一级特黄aa大片免费 | 一级特黄性色生活片 | 在线观看的黄色 | 美国a级毛片 | 国内自拍视频在线播放 | 天天爱天天射 | 日日日干 | 毛片 mp4| 成人 亚洲 成人影院 | 国产在线爱做人成小视频 | 色老头在线观看精品 | 久久久久国产精品嫩草影院 | 91精品国产入口 | 日日操夜夜爱 | 一级毛片在线免费观看 | 欧美精品三区 |