home *** CD-ROM | disk | FTP | other *** search
/ MS DOS Archives 1 / MS-DOS_Archives_Volume_One_Walnut_Creek.iso / msdos / turbo_c / move.c < prev    next >
C/C++ Source or Header  |  1989-05-26  |  7KB  |  162 lines

  1. From: timphus@stltar.stl.informatik.uni-dortmund.de (Stefan Timphus)
  2. Subject: move, improved file mover, C source
  3. Date: 26 May 89 09:00:17 GMT
  4.  
  5. MOVE allows DOS users the ability to MOVE files from one directory to
  6. another with a minimum of effort.
  7.  
  8.   1)   MOVE is extremely FAST (because it uses the rename() function)
  9.   2)   The * and ? are fully supported.
  10.   3)   If a file in the destination directory exists under the same name, MOVE
  11.        will prompt the user if he/she wants to overwrite it.
  12.   4)   Files with special attributes are handled accordingly.
  13.  
  14. Stefan Timphus
  15. timphus@stltar.stl.informatik.uni-dortmund.de
  16. simula@trillian.irb.informatik.uni-dortmund.de
  17.  
  18. BEGIN--cut here--cut here
  19. #include <stdio.h>
  20. #include <dir.h>
  21. #include <string.h>
  22.  
  23. char    newpath[MAXPATH], pathname[MAXPATH],newname[MAXPATH], oldname[MAXPATH];
  24. char    drive[MAXDRIVE], subdir[MAXDIR], file[MAXFILE], ext[MAXEXT];
  25. char    helpname[MAXPATH], sourcename[MAXPATH];
  26.  
  27. struct ffblk dta;
  28.  
  29. int main(int argc,char *argv[])
  30. {
  31.     int len, done, count=0, wassubdir=1, loop, gavename=0, star=0;
  32.  
  33.     if(argc != 3){      /* Test for proper number of command line arguments */
  34.     printf("\nUsage:   move [path]file(s).ext path[file.ext]|file.ext");
  35.     printf("\n         The * and ? wild cards are permitted for moving.\n");
  36.     return(1);
  37.     }
  38.     strcpy(sourcename,argv[1]);
  39.     strcpy(newpath,argv[2]);    /* Save a copy of the destination path */
  40.     strcpy(subdir,argv[2]);     /* In this place too ! */
  41.     strcpy(helpname,argv[2]);   /* In this place too ! */
  42.     len = strlen(newpath);      /* Get destination path length */
  43.     if(newpath[len-1] == 92)    /* Did user supply a '\' on destination path */
  44.       {
  45.        wassubdir=0;             /* Destination was meant to be a directory */
  46.        if (len>1)               /* Make sure whether you move to root-directory */
  47.                 /* Was bug in previous release; */
  48.                 /* move to root was not possible */
  49.        subdir[len-1] = 0;       /* If '\' on destination path, */
  50.                 /* remove '\' from the secondary copy */
  51.       }
  52.       else                      /* If no, add one to primary copy */
  53.        {
  54.     newpath[len] = 92;      /* Add the '\' */
  55.     newpath[len+1] = 0;     /* Don't forget to terminate it */
  56.        }
  57.     getcwd(newname,MAXPATH);    /* Save the directory we were called from */
  58.  
  59.     /* The following block supposes that user wants to rename a file */
  60.     if(chdir(subdir) * wassubdir)   /* This block enables renaming across
  61.                     directories for single files.
  62.                     added by Stefan Timphus */
  63.        {
  64.         fnsplit(helpname,drive,subdir,file,ext); /* Break up the dest file name */
  65.         gavename=1;         /* Name for renaming was given */
  66.         newpath[len]=0;         /* Remove the '\' */
  67.         strcat(file,ext);
  68.         len=strlen(subdir);
  69.         subdir[len-1]=0;        /* here too */
  70.         wassubdir=0;            /* really wasn't but is asked later */
  71.         for (loop=0;sourcename[loop]!=0;loop++)
  72.         {
  73.             if ((sourcename[loop]=='*') || (sourcename[loop]=='?'))
  74.             star++;              /* check if you want to rename */
  75.         }            /* several files, which is impossible */
  76.         for (loop=0;file[loop]!=0;loop++)
  77.         {
  78.             if ((file[loop]=='*') || (file[loop]=='?'))
  79.             star++;              /* you want to rename a single */
  80.         }            /* file, so don't give '*' or '?' */
  81.                     /* in the destination name */
  82.         if (star)
  83.         {
  84.             printf("? or * not allowed if file is to be renamed\n");
  85.             return 11;
  86.         }
  87.     }   /* End additional block*/
  88.    
  89.     /* This line is new for the second modification */
  90.     chdir(newname);
  91.  
  92.     if(chdir(subdir) * wassubdir)          /* See if the destination directory exists */
  93.       {
  94.        printf("Cannot change directory to %s ... quitting.",subdir);
  95.        return 1;
  96.       }
  97.     chdir(newname);                         /* Go back to home directory */
  98.     fnsplit(argv[1],drive,subdir,file,ext); /* Break up the source file name */
  99.     sprintf(pathname,"%s%s",drive,subdir);  /* Save path of source file(s) */
  100.     done = findfirst(argv[1],&dta,47);      /* Go look for first file */
  101. while(!done){
  102.     strcpy(oldname,pathname);      /* Start "creating" the old filename */
  103.     strcat(oldname,dta.ff_name);
  104.     strupr(oldname);               /* Make it all upper case for DOS */
  105.     strcpy(newname,newpath);   /* Start "creating" destination filename */
  106.     if (!gavename)             /* Real moving without rename */
  107.     {
  108.     strcat(newname,dta.ff_name);
  109.     }
  110.     strupr(newname);              /* Make it upper case too */
  111.     if(rename(oldname,newname)==0)    /* Try to rename the file */
  112.       {                              /* If successful, ... */
  113.     count++;                     /* Increment total files moved */
  114.     printf("%-15s moved to %s\n",oldname,newname);   /* Notify user */
  115.     done=findnext(&dta);         /* Look for next one */
  116.     continue;
  117.       }
  118. /* If we can't rename it, A) File already exists, or B) File has permissions */
  119.    printf("The file %s exists, do you want to overwite it (y/n) ",newname);
  120.    len = getche();      /* Get their keypress */
  121.    putchar('\n');
  122.    if(len=='y' || len=='Y')
  123.      {
  124.       if(_chmod(newname,1,0))        /* Set file permissions to r/w */
  125.          printf("Error changing mode of %s. %s not moved.\n",newname,oldname);
  126.         else
  127.           if(remove(newname))
  128.              printf("Error removing %s. %s not moved.\n",newname,oldname);
  129.             else
  130.              continue;           /* After removing file, re-attempt rename */
  131. /* If we can't change the mode or delete the file, forget it! */
  132.      }
  133.    done=findnext(&dta);           /* Find next file matching argv[1] */
  134. }                                  /* End of while */
  135.    if(count>0)                        /* Tell user how much work we did */
  136.       printf("\nNumber of files moved: %3d\n",count);
  137.     else
  138.       printf("No files match.\n");
  139. }
  140. /*  Program compiled using TURBO C VER-2.0
  141.     Written by Shawn Antol
  142.     AT&T Bell Labs
  143.     312-979-5622
  144.     att!ihlpb!santol
  145.     My employer and I are not accountable for any damages
  146.     resulting from the use of this program. It has been tested on
  147.     PC Compatibles using DOS 3.1 and DOS 3.2 and found to have no
  148.     no known bugs (I found one and removed it; Stefan Timphus).
  149.  
  150.     1989-04-11
  151.     Modified by Stefan Timphus, University Dortmund
  152.     +49 231 755-4663
  153.     To make it more UNIX-like.
  154.     Now can also be used for simple renaming and renaming
  155.     across directories, but only for single files.
  156.     Version for renaming multiple files should be possible.
  157.     Compiled using Turbo-C 2.0.
  158.     timphus@stltar.stl.informatik.uni-dortmund.de
  159.     simula@trillian.irb.informatik.uni-dortmund.de
  160. */
  161. END--cut here--cut here
  162.