linux下c語言遞迴法查詢檔案,並列印絕對地址
阿新 • • 發佈:2019-01-31
c語言遞迴法查詢指定目錄下的檔案或目錄
本程式碼是個人學習過程中寫下的小練筆,如果您發現問題,歡迎指正。
編譯環境:linux+gcc, windows下尚未測試
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<dirent.h> #include<sys/time.h> #include<unistd.h> //int count; char path[1000]; char name[100]; //struct timeval t1,t2; void ls(char *path,char *name) { char apath[1000]; DIR *dir; //千萬不能設為全域性變數 char newpath[1000]; struct dirent *ptr; dir=opendir(path); if(dir!=NULL) { while((ptr=readdir(dir))!=NULL) { //printf("%s\n",ptr->d_name); if(ptr->d_type==4&&strcmp(ptr->d_name,".")!=0&&strcmp(ptr->d_name,"..")!=0) //條件設定儘可能精確,防止誤排除 { if(strcmp(ptr->d_name,name)==0)//篩選出符合條件的目錄 { strcpy(apath,path); //絕對不能直接獲取絕對路徑 if(apath[strlen(apath)-1]=='/') //判斷地址格式 { strcat(apath,ptr->d_name); } else { strcat(apath,"/"); strcat(apath,ptr->d_name); } printf("%s\n",apath); //列印絕對地址 } if(path[strlen(path)-1]=='/') { sprintf(newpath,"%s%s",path,ptr->d_name); } else { sprintf(newpath,"%s/%s",path,ptr->d_name); } ls(newpath,name); //遞迴迴圈 } else if(strcmp(ptr->d_name,".")!=0&&strcmp(ptr->d_name,"..")!=0&&strcmp(ptr->d_name,name)==0) //篩選出同名檔案 { strcpy(apath,path); if(apath[strlen(apath)-1]=='/') { strcat(apath,ptr->d_name); } else { sprintf(apath,"%s/%s",apath,ptr->d_name); } printf("%s\n",apath ); //++count; } } closedir(dir); } else { //printf("Failed to open %s, need permission!\n",path); } } int main(void) { while(1) { //count=0; printf("path:"); //查詢目錄 scanf("%s",path); //檔名稱 printf("file:"); scanf("%s",name); //gettimeofday(&t1,NULL); //LINUX下計時,效能測試工具 ls(path,name); //gettimeofday(&t2,NULL); //long timeuse =1000000 * ( t2.tv_sec - t1.tv_sec ) + t2.tv_usec - t1.tv_usec; //printf("total files %d \ntotal time %f s\n",count,timeuse/1000000.0); } }