Soucis sur fonction de copie de fichier
Le
Matt...

Bonjour,
J'ai la fonction suivant qui copie un fichier d'un endroit vers un autre=
. =
Apparemment il y a un soucis quelque part car la taille de certains =
fichiers est différente avant et après ???
http://mirabon.free.fr/dev/copier.txt
avec TAILLE_BUFFER_COPY = 1024
Merci pour vos réponses,
Bertrand.
-- =
Utilisant le logiciel de courrier révolutionnaire d'Opera : =
http://www.opera.com/mail/
J'ai la fonction suivant qui copie un fichier d'un endroit vers un autre=
. =
Apparemment il y a un soucis quelque part car la taille de certains =
fichiers est différente avant et après ???
http://mirabon.free.fr/dev/copier.txt
avec TAILLE_BUFFER_COPY = 1024
Merci pour vos réponses,
Bertrand.
-- =
Utilisant le logiciel de courrier révolutionnaire d'Opera : =
http://www.opera.com/mail/
Outch l'indentation...
do { } while(taille == TAILLE_BUFFER_COPY); est très très moche.
RETURN VALUE
On success, fread() and fwrite() return the number of items read or
written. This number equals the number of bytes transferred only when size
is 1. If an error occurs, or the end of the file is reached, the return
value is a short item count (or zero).
fread() does not distinguish between end-of-file and error, and callers must
use feof(3) and ferror(3) to determine which occurred.
Donc à la fin du fichier, taille != TAILLE_BUFFER_COPY et les derniers octets
ne sont pas écrits.
J'aurais tendance a faire :
while (taille = fread(buffer, sizeof(char), TAILLE_BUFFER_COPY, fps);
fwrite(buffer, sizeof(char), taille, fpd);
}
(sûrement pas du tout blindé)
Bonjour,
Désolé, mais à la base c'est bien indenté ???
Je ne pense pas que cela vienne de la, car je lis, j'écris et aprà ¨s je
regarde le nombre de "char" lu.
Si je n'ai lu que 25 "char", je les écrits et je vois que la taille est
différente donc je sors.
Merci quand même,
Matt...
--
Utilisant le logiciel de courrier révolutionnaire d'Opera :
http://www.opera.com/mail/
le 22/08/2013 à 20:36, Matt... a écrit dans le message
Pourquoi ne postes-tu pas ton code ici plutôt que d'obliger tes lecteurs
à aller voir ton lien ? Tu aurais sans doute plus de réponses...
Je le remets (réindenté) :
----------------------------------------------------------------------------
bool copieFichier(const char *szFichierSrc, const char *szFichierDst)
{
bool ret = false;
char buffer[TAILLE_BUFFER_COPY] = {0};
// Test sur les chaines en entrees
if (szFichierSrc == NULL)
{
writeLog(true, CRITICAL, "Le chemin du fichier source est NULLn");
return ret;
}
if(szFichierDst == NULL)
{
writeLog(true, CRITICAL,
"Le chemin du fichier destination est NULLn");
return ret;
}
// Ouverture du fichier pour la lecture
FILE *const fps = fopen (szFichierSrc, "rb");
if (fps != NULL)
{
// Ouverture du fichier pour l'ecriture
FILE *const fpd = fopen (szFichierDst, "wb");
if (fpd != NULL)
{
size_t taille = 0;
ret = true;
do {
taille = fread(buffer, sizeof(char), TAILLE_BUFFER_COPY, fps);
fwrite(buffer, sizeof(char), taille, fpd);
} while (taille == TAILLE_BUFFER_COPY);
// Fermeture fichier destination
fclose(fpd);
}
else
{
//Erreur ouverture fichier dst
writeLog(true, CRITICAL,
"Erreur a l'ouverture du fichier %sntMotif : %sn",
szFichierDst, strerror(errno));
}
// Fermeture fichier source
fclose(fps);
}
else
{
// Erreur ouverture fichier src
writeLog(true, CRITICAL,
"Erreur a l'ouverture du fichier %sntMotif : %sn",
szFichierSrc, strerror(errno));
}
return ret;
}
----------------------------------------------------------------------------
Je ne vois pas pourquoi tu n'obtiens pas le même résultat.
Par contre :
- par définition sizeof(char) == 1
- tu retournes true même si tes lectures/écritures se passent mal
(tu vérifies juste que tu as pu ouvrir les fichiers).
Tu devrais vérifier que tes écritures comportes le même nombre de bytes
que la lecture.
Tu devrais vérifier à la fin de ton do { } while () que tu es bien à la
fin du fichier avec feof() ou qu'il n'y a pas d'erreur avec ferror().
--
Benoit Izac