home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / VRAC / CUJJUN93.ZIP / 1106133A < prev    next >
Text File  |  1993-04-01  |  2KB  |  70 lines

  1. /* findfile.c: Search all directories for a file */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <assert.h>
  6. #include <dirent.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <dir.h>
  10. #include <io.h>
  11. #include <string.h>
  12.  
  13. /* Change these for UNIX */
  14. #define SEPSTR "\\"
  15. #define OFFSET 2
  16.  
  17. void visit_dirs(char *dir, char *file);
  18.  
  19. main(int argc, char *argv[])
  20. {
  21.     if (argc > 1)
  22.     {
  23.         char *file = argv[1];
  24.         char *root = (argc > 2) ? argv[2] : SEPSTR;
  25.  
  26.         visit_dirs(root,file);
  27.     }
  28.     return 0;
  29. }
  30.  
  31. void visit_dirs(char *dir, char *file)
  32. {
  33.     DIR *dirp;
  34.     struct dirent *entry;
  35.     struct stat finfo;
  36.     char *curdir = getcwd(NULL,FILENAME_MAX);
  37.  
  38.     /* Enter the directory */
  39.     assert(chdir(dir) == 0);
  40.     
  41.     /* Process current directory */
  42.     if (access(file,0) == 0)
  43.     {
  44.         char *tempdir = getcwd(NULL,FILENAME_MAX);
  45.         char *sep = strcmp(tempdir+OFFSET,SEPSTR) ?
  46.                     SEPSTR : "";
  47.         printf("%s%s%s\n",
  48.                strlwr(tempdir+OFFSET),sep,strlwr(file));
  49.         free(tempdir);
  50.     }
  51.     
  52.     /* Descend into subdirectories */
  53.     assert((dirp = opendir(".")) != NULL);
  54.     while ((entry = readdir(dirp)) != NULL)
  55.     {
  56.         if (entry->d_name[0] == '.')
  57.             continue;
  58.         stat(entry->d_name,&finfo);
  59.         if (finfo.st_mode & S_IFDIR)
  60.             visit_dirs(entry->d_name,file);
  61.     }
  62.  
  63.     /* Cleanup */
  64.     closedir(dirp);
  65.     chdir(curdir+OFFSET);
  66.     free(curdir);
  67. }
  68.  
  69.  
  70.