[Débutant] Déplacer tous les fichiers d'un répertoire A ver B, pb avec rename()

Signaler
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014
-
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
-
Bonjour à tous.

L'objectif de mon programme est :
- lister à l'écran tous les fichiers contenu dans un repertoire A
- transférer tous les fichier du répertoire A vers B

Tout fonctionne sauf que j'ai un petit problème avec l'utilisation de la fonction rename, je ne sais pas trop m'en servir malgré avoir parcouru le man et les exemples.

Pourriez vous m'éclairer sur son utilisation ?

PS : auriez vous également une piste pour éviter que le programme n'affiche à l'écran les fichiers "." et ".."

Merci beaucoup pour votre aide

#include <stdio.h>

#include <dirent.h>
 
int main(void){
    
    printf("Bienvenu, ce programme liste et deplace des fichiers\n");
    printf("*********************
<wbr>******************************<wbr>****\n");

    while(1){
    DIR * repSource = opendir("./dirA"); // on ouvre le répertoire A
    DIR * repDest = opendir("./dirB"); // on ouvre le répertoire B

        if (repSource != NULL){
            struct dirent * ent;
            printf("Le logiciel a trouvé les fichiers suivants : \n");

            while ((ent = readdir(repSource)) != NULL){
                printf("%s\n", ent->d_name);//on affiche la liste des fichiers
                //rename("./dirA/".ent->d_<wbr>name, "./dirB/".ent->d_name); // c'est ici que je rencontre mon problème pour déplacer le fichier

            }
            printf("-------On attend 5 seconde pour refaire l'opération-------\n");
            printf("---------------------<wbr>------------------------------<wbr>----\n");
        

            closedir(repSource);
            closedir(repDest);
        }
        else {printf("El directorio no existe \n");exit(1);}
        sleep(5);//esperamos 5 segundas antes de buscar de nuevo

    }
     
    return 0;
}</wbr></wbr></wbr></wbr></wbr>

4 réponses

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

Le C ce n'est pas comme le PHP ou autres truc du genre, le point n'est pas un opérateur de contaténation de chaînes de caractères. En conséquent, ton «"./dirA/".ent->d_<wbr>name» & co ne compilera pas. Il te faut utiliser strcat ou une de ses amies pour obtenir le chemin (strncat est plus conseillée). Un conseil : au lieux de malloc un tableau tu peux te servir de la taille maximale d'un chemin pour te faire un tableau directement de cette taille. Cette taille est macro-définie dans limits.h (enfin, souvent dans un fichier inclu par ce dernier) et se nomme _POSIX_PATH_MAX , penses juste a define _GNU_SOURCE avant d'inclure limits.h et ce sera bon.

Sinon juste comme ça, c'est assez étrange de faire un programme a moitié en français et a moitié en espagnol. Bref, vive gettext.
</wbr>
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014

merci pour votre réponse

mais ne fonctionne toujours pas avec

rename(strncat("./dirA/"),(ent->d_name),0), strncat ("./dirB/"),(ent->d_name),0);
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014

Autre solution qui ne fonctionne pas :

    char archivoA[128];
    char archivoB[128]
...

                archivoA=strcat("./dirA/",ent->d_name);
                archivoB=strcat ("./dirB/",ent->d_name);
                rename(archivoA,archivoB);

merci pour votre aide
Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
12
Salut,

Je te conseille très fortement de relire le manuel de strcat. Tu y découvriras que strcat copie le contenu de la seconde chaîne a la suite de la première et qu'en conséquent :
 - la première chaîne ne peux pas être constante vu qu'elle doit être modifiée, or une chaîne en dure entre quotes est une chaîne constante (a moins de compiler avec -fwritable-strings ou -traditional).
 - la première chaîne doit avoir assez de place pour contenir la seconde, ce qui n'est pas le cas de ta chaîne en dur vu qu'elle a juste ce qu'il lui faut en mémoire.

Bref, une solution est, comme je l'ai déjà dit, de se faire un tableau a l'aide de _POSIX_PATH_MAX et de l'utiliser.

Un exemple simpliste :
#define _GNU_SOURCE
#include <limits.h>
#include <limits.h>
#include <string.h>

int     main(void)
{
  char  path[_POSIX_PATH_MAX];

  strcpy(path, "/home/toto/");
  strcat(path, "documents/machin.txt");
  puts(path);
  return 0;
}