/* Duplication de 2 disques ou partitions de disques durs
avec suivi du déroulement de la copie */
#include <stdio.h>
#define szbuf 2048
#define nlecmega 512
main (int narg, char **varg)
{
char orig [20], dest [20];
FILE *ficorig, *ficdest;
long nboct, nbmega;
unsigned char buffer [szbuf];
int retour;
// Controle du nombre d'arguments
if (narg == 3)
{
// récupération du nom du device source
if (memcmp (varg [1], "/dev", 4) == 0)
strcpy (orig, varg [1]);
else
{
strcpy (orig, "/dev/");
strcat (orig, varg [1]);
}
// récupération du nom du device destination
if (memcmp (varg [2], "/dev", 4) == 0)
strcpy (dest, varg [2]);
else
{
strcpy (dest, "/dev/");
strcat (dest, varg [2]);
}
// test d'existence des devices source et destination
testfic (orig);
testfic (dest);
// ouverture des fichiers
ficorig = fopen (orig, "rb");
ficdest = fopen (dest, "wb");
if (ficorig != NULL && ficdest != NULL)
{
nboct = 0;
nbmega = 0;
retour = fread (buffer, szbuf, 1, ficorig);
while (retour > 0)
{
nboct ++;
if (nboct & nlecmega)
{
nboct = 0;
nbmega ++;
if (nbmega % 10 == 0)
{
printf ("\r%5d Mo copiés", nbmega);
fflush (stdout);
}
}
retour = fwrite (buffer, szbuf, 1, ficdest);
if (retour > 0)
retour = fread (buffer, szbuf, 1, ficorig);
else
fprintf (stderr,
"\rDisque destination %s plus petit que celui d'origine %s\n", dest, orig);
}
printf ("\r%5d Mo copiés \n", nbmega);
fflush (stdout);
fclose (ficorig);
fclose (ficdest);
}
else
fprintf (stderr, "Problème d'accès à un fichier\n");
}
else
fprintf (stderr, "Syntaxe : %s source destination\n", varg [0]);
}
testfic (char *fichier)
{
if (access (fichier, 0) != 0)
{
fprintf (stderr, "Fichier %s inexistant\n", fichier);
exit (1);
}
}