home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_06 / 1106134a < prev    next >
Text File  |  1993-02-27  |  2KB  |  92 lines

  1. /* ddir.c:  Remove directory tree */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <io.h>
  6. #include <string.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <assert.h>
  10.  
  11. /* All POSIX-compliant systems have this one */
  12. #include <dirent.h>
  13.  
  14. /* Borland C also requires this one */
  15. #include <dir.h>
  16.  
  17. /* This is required to redirect stderr on DOS */
  18. #include "stderr.h"
  19.  
  20. /* DOS-specific macros - change for other OS */
  21. #define CMD_FORMAT "del *.* <%s > nul"
  22. #define CMD_LEN 17
  23.  
  24. /* Change this to "/" for UNIX */
  25. char Response_file[L_tmpnam+1] = "\\";
  26.  
  27. void rd(char *);
  28.  
  29. main(int argc, char **argv)
  30. {
  31.     FILE *f;
  32.     char *old_path = getcwd(NULL,FILENAME_MAX);
  33.  
  34.     /* Create response file for DOS del command */
  35.     tmpnam(Response_file+1);
  36.     assert((f = fopen(Response_file,"w")) != NULL);
  37.     fputs("Y\n",f);
  38.     fclose(f);
  39.  
  40.     /* Delete the directories */
  41.     while (--argc)
  42.         rd(*++argv);
  43.  
  44.     /* Clean-up */
  45.     remove(Response_file);
  46.     chdir(old_path);
  47.     free(old_path);
  48.     return 0;
  49. }
  50.  
  51. void rd(char * dir)
  52. {
  53.     char sh_cmd[L_tmpnam+CMD_LEN];
  54.     DIR *dirp;
  55.     struct dirent *entry;
  56.     struct stat finfo;
  57.  
  58.     /* Log onto the directory that is to be deleted */
  59.     assert(chdir(dir) == 0);
  60.     printf("%s:\n",strlwr(dir));
  61.  
  62.     /* Delete all normal files via OS shell */
  63.     hide_stderr();
  64.     sprintf(sh_cmd,CMD_FORMAT,Response_file);
  65.     system(sh_cmd);
  66.     restore_stderr();
  67.  
  68.     /* Delete any remaining directory entries */
  69.     assert((dirp = opendir(".")) != NULL);
  70.     while ((entry = readdir(dirp)) != NULL)
  71.     {
  72.         if (entry->d_name[0] == '.')
  73.             continue;
  74.         stat(entry->d_name,&finfo);
  75.         if (finfo.st_mode & S_IFDIR)
  76.             rd(entry->d_name);      /* Subdirectory */
  77.         else
  78.         {
  79.             /* Enable delete of file, then do it */
  80.             chmod(entry->d_name,S_IWRITE);
  81.             assert(unlink(entry->d_name) == 0);
  82.         }
  83.     }
  84.     closedir(dirp);
  85.  
  86.     /* Remove the directory from its parent */
  87.     assert(chdir("..") == 0);
  88.     assert(rmdir(dir) == 0);
  89. }
  90.  
  91.  
  92.