home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 6 File / 06-File.zip / ramfs102.zip / src / rcopy.c < prev    next >
C/C++ Source or Header  |  2002-10-21  |  2KB  |  96 lines

  1. /* rcopy.c: a small file copying program.
  2.  *
  3.  * Creates the destination file in its final size before copying data.
  4.  * This should improve speed when copying large files to a ramfs drive
  5.  * under OS/2, compared to using COPY or XCOPY.
  6.  *
  7.  * Karl Olsen, kro@post3.tele.dk
  8.  */
  9.  
  10. /* Note: this program becomes obsolete with the performance patch.
  11.    AAB 21/10/2002 */
  12.  
  13. #include <stdio.h>
  14.  
  15.  
  16. char buffer[32768u];
  17.  
  18.  
  19. int main (int argc, char **argv)
  20. {
  21.   FILE *srcfile;
  22.   FILE *dstfile;
  23.   long srcsize;
  24.   size_t bytesread;
  25.   size_t byteswritten;
  26.   
  27.   if (argc != 3)
  28.   {
  29.     fprintf (stderr, "Syntax: RCOPY sourcefile destfile\n");
  30.     return 1;
  31.   }
  32.   
  33.   /* Open the source file */
  34.   srcfile = fopen (argv[1], "rb");
  35.   if (srcfile == NULL)
  36.   {
  37.     fprintf (stderr, "Error: Cannot open source file %s.\n", argv[1]);
  38.     return 1;
  39.   }
  40.   
  41.   /* Find the size of the source file */
  42.   fseek (srcfile, 0, SEEK_END);
  43.   srcsize = ftell (srcfile);
  44.   fseek (srcfile, 0, SEEK_SET);
  45.   
  46.   /* Create the destination file */
  47.   dstfile = fopen (argv[2], "wb");
  48.   if (dstfile == NULL)
  49.   {
  50.     fclose (srcfile);
  51.     fprintf (stderr, "Error: Cannot create destination file %s.\n", argv[2]);
  52.     return 1;
  53.   }
  54.   
  55.   /* Set the size of the destination file by writing a byte to the last
  56.    * position in it */
  57.   if (srcsize != 0L)
  58.   {
  59.     fseek (dstfile, srcsize-1, SEEK_SET);
  60.     if (fwrite (buffer, 1, 1, dstfile) != 1)
  61.     {
  62.       fclose (srcfile);
  63.       fclose (dstfile);
  64.       fprintf (stderr, "Error: Cannot set size of destination file.\n");
  65.       return 1;
  66.     }
  67.     fseek (dstfile, 0, SEEK_SET);
  68.   }
  69.   
  70.   /* Copy chunks of data from source to destination */
  71.   while (srcsize)
  72.   {
  73.     bytesread = fread (buffer, 1, sizeof(buffer), srcfile);
  74.     if (bytesread == 0)
  75.     {
  76.       fclose (srcfile);
  77.       fclose (dstfile);
  78.       fprintf (stderr, "Error: Read 0 bytes from source file.\n");
  79.       return 1;
  80.     }
  81.     byteswritten = fwrite (buffer, 1, bytesread, dstfile);
  82.     if (byteswritten != bytesread)
  83.     {
  84.       fclose (srcfile);
  85.       fclose (dstfile);
  86.       fprintf (stderr, "Error: Could not write %u bytes to destination file.\n",
  87.                bytesread);
  88.       return 1;
  89.     }
  90.     srcsize -= bytesread;
  91.   }
  92.   fclose (srcfile);
  93.   fclose (dstfile);
  94.   return 0;
  95. }
  96.