1. 程式人生 > >linux下c語言遞迴法查詢檔案,並列印絕對地址

linux下c語言遞迴法查詢檔案,並列印絕對地址

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);
}
}