Problème renommer des fichiers avec la fonction rename() [Résolu]

kepon72 25 Messages postés jeudi 23 avril 2009Date d'inscription 27 novembre 2011 Dernière intervention - 19 nov. 2011 à 12:23 - Dernière réponse : kepon72 25 Messages postés jeudi 23 avril 2009Date d'inscription 27 novembre 2011 Dernière intervention
- 20 nov. 2011 à 18:58
Bonjour,
Voila j'ai coder un petit programme en C qui me permet de renommer des fichiers .avi présent dans un répertoire de la même façon le Titre est recuperer depuis un fichier texte et le mon problème c'est que les fichiers ne sont pas renommer or la chaine de l'ancien nom est correct et celle du nouveau aussi...
Voici mon code:
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <windows.h>
#include <string.h>

#define MAX_CHAR   85

void lecture_dir(const char* dir)
{
    struct dirent *lecture;
    DIR *rep;   
    FILE *fichier;
    rep=opendir(dir);   
    fichier=fopen("Titres.txt", "r");
    int i=0; int c=0;
    long len_name, len_dir, len_sl, len, len1, len_title=0;
    char D='-'; char chaine[MAX_CHAR];
    char* buffer;
    char* buffer1;
    char* pTitle[500];
    const char* Slash="\";
    
    /////////////////////////////////*************** Ouverture fichier Titres.txt **************///////////////////////////////////////
    while(fgets(chaine, MAX_CHAR, fichier) != NULL)
    {
         len_title=strlen(chaine);
         pTitle[c]=(char *)calloc(len_title+1, sizeof(char));
         strcpy(pTitle[c], chaine); 
         printf("Num: %d Titre: %s", c, pTitle[c]);
         c++;
    }
    fclose(fichier);
    printf("\n");
    /////////////////////////////////********************* Ouverture repertoire *****************///////////////////////////////////////  
    while(lecture=readdir(rep))
    {
         if(strcmp(lecture->d_name, ".")!=0)
         if(strcmp(lecture->d_name, "..")!=0)
         if(strcmp(lecture->d_name, "desktop.ini")!=0)
         if(strcmp(lecture->d_name, "Desktop.ini")!=0)
         {
                    len_name=strlen(lecture->d_name);
                    len_dir=strlen(dir);
                    len_sl=strlen(Slash);
                    len=len_name+len_dir+len_sl;
                    len1=len_title+len_dir+len_sl;
                    
                    buffer=(char *)calloc(len+1, sizeof(char));
                    buffer1=(char *)calloc(len1+1, sizeof(char));
                    
                    strcat(buffer, dir);
                    strcat(buffer, Slash);
                    strcat(buffer, lecture->d_name); //De la forme "test\\Old_Nom_fichier.avi" 
                    
                    strcat(buffer1, buffer);
                    
                    for(int j=0;j<=len1;j++)
                    {
                         if((buffer1[j])==D)
                         {
                             strcpy(buffer1+j+1, pTitle[i]); //De la forme "test\\01.02 - New_Nom_fichier.avi" 
                             printf("%s\n", buffer1);
                             if(rename(buffer, buffer1)==0)
                             {
                                 printf(" %s Ok\n", buffer1);
                             }
                         }
                    }
         i++;
         }
    }
    closedir(rep);
}

int main(void)
{
    int c;
    char* choix;
    
    choix=(char *)calloc(20+1, sizeof(char));
    scanf("%d", &c);
    switch(c)
    {
        case 1:
            strcpy(choix, "Saison 1");
            lecture_dir(choix);
            getchar();
            break;
        case 2:
            strcpy(choix, "Saison 2");     
            lecture_dir(choix); 
            getchar();    
            break;
        case 3:
            strcpy(choix, "Saison 3"); 
            lecture_dir(choix);
            getchar();
            break;
        case 4:
            strcpy(choix, "Saison 4"); 
            lecture_dir(choix);
            getchar();
            break;
        case 5:
            strcpy(choix, "Saison 5"); 
            lecture_dir(choix);
            getchar();
            break;
        case 6:
            strcpy(choix, "Saison 6"); 
            lecture_dir(choix);
            getchar();
            break;
        case 7:
            strcpy(choix, "Saison 7"); 
            lecture_dir(choix);
            getchar();
            break;
        case 8:
            strcpy(choix, "Saison 8"); 
            lecture_dir(choix);
            getchar();
            break;
        case 9:
            strcpy(choix, "Saison 9"); 
            lecture_dir(choix);
            getchar();
            break;
        case 10:
            strcpy(choix, "Saison 10"); 
            lecture_dir(choix);
            getchar();
            break;
        default:
            strcpy(choix, "test");
            lecture_dir(choix);
            getchar();
            break;
    }
    return 0;
}

et voici le fichier Titres.txt:
 Illuminatti.avi
 La relève.avi
 Monsieur Ed.avi
 Partenaires.avi
 Super héros.avi
 Un meurtrier parmi nous.avi
 Retour vers le futur.avi
 Gormogon.avi
 La magie de Noël.avi
 À toute vitesse.avi
 L'ésprit d'équipe.avi
 Lorsque l'enfant paraît&#8230;.avi
 La Raison et le cœur.avi
 Mélodie pour un meurtre.avi
 L&#8217;Apprenti.avi
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 20 nov. 2011 à 18:23
3
Merci
Salut,

A vue de nez, au moins un problème, len_title est affecté dans la première boucle successivement pour chaque titre, puis elle est utilisée dans la deuxième boucle où elle ne peut valoir que la longueur du dernier titre contenu dans le fichier.

Attention au saut de ligne quand on récupère les lignes avec fgets.

Les lenXXX dans tout les sens ne facilitent pas la compréhension...
Pour trouver un caractère, utiliser strchr est souvent plus simple que de boucler sur la chaîne.

#include <stdio.h>
#include <dirent.h>
#include <string.h>

#define MAX_CHAR  128

FILE* safeOpenFile(char* lpPath, char* lpMode, FILE** lpFile)
{
  *lpFile = fopen(lpPath, lpMode);
  if (!*lpFile)
  {
    printf("Cannot open file "%s"", lpPath);
  }
  return *lpFile;
}

DIR* safeOpenDir(char* lpPath, DIR** lpDir)
{
  *lpDir = opendir(lpPath);
  if (!*lpDir)
  {
    printf("Cannot open directory "%s"", lpPath);
  }
  return *lpDir;
}

void update_dir(char* lpPath)
{
  FILE* lpFile;
  DIR* lpDir;
  int nTitlesCount;
  char lpNewTitles[500][MAX_CHAR];
  char* lpLineFeed;
  int nTitleIndex;
  struct dirent* lpDirectoryEntry;
  char lpOldFileName[MAX_CHAR];
  char lpNewFileName[MAX_CHAR];
  char* lpDash;
  char lpOldFilePath[MAX_CHAR];
  char lpNewFilePath[MAX_CHAR];

  if (safeOpenFile("Titres.txt", "r", &lpFile))
  {
    /* List all titles in Titres.txt */
    nTitlesCount = 0;
    while(fgets(lpNewTitles[nTitlesCount], MAX_CHAR, lpFile) != NULL)
    {
      /* Remove line feed if necessary */
      lpLineFeed = strchr(lpNewTitles[nTitlesCount], '\n');
      if (lpLineFeed)
        lpLineFeed[0] =0;
      printf("New title name: "%s", index: %d\n", lpNewTitles[nTitlesCount], nTitlesCount);
      nTitlesCount++;
    }

    if (safeOpenDir(lpPath, &lpDir))
    {
      for (nTitleIndex = 0; nTitleIndex < nTitlesCount; nTitleIndex++)
      {
        while ((lpDirectoryEntry = readdir(lpDir)))
        {
          if (strcmp(lpDirectoryEntry->d_name, "."))
            if (strcmp(lpDirectoryEntry->d_name, ".."))
              if (strcmp(lpDirectoryEntry->d_name, "desktop.ini"))
                if (strcmp(lpDirectoryEntry->d_name, "Desktop.ini"))
                  break;
        }
        if (!lpDirectoryEntry)
        {
          printf("No more files found in %s\n", lpPath);
          break;
        }
        strcpy(lpOldFileName, lpDirectoryEntry->d_name);
        strcpy(lpNewFileName, lpOldFileName);
        lpDash = strchr(lpNewFileName, '-');
        if (!lpDash)
        {
          printf("Cannot find dash in "%s"\n", lpNewFileName);
          break;
        }
        lpDash[1] = 0; /* Truncate after the dash */
        strcat(lpNewFileName, lpNewTitles[nTitleIndex]);
        sprintf(lpOldFilePath, "%s\\%s", lpPath, lpOldFileName);
        sprintf(lpNewFilePath, "%s\\%s", lpPath, lpNewFileName);
        printf("Old file name: "%s"\n", lpOldFilePath);
        printf("New file name: "%s"\n", lpNewFilePath);
        if (rename(lpOldFilePath, lpNewFilePath))
        {
          puts("Renaming failed");
          break;
        }
      }
      closedir(lpDir);
    }
    fclose(lpFile);
  }
}

int main(void)
{
  int nSeason;
  char lpSeason[128];

  scanf("%d", &nSeason);
  if ((nSeason >= 1) && (nSeason <= 10))
  {
      sprintf(lpSeason, "Saison %d", nSeason);
      update_dir(lpSeason);
  }
  else
  {
    update_dir("test");
  }
  return 0;
}

Merci cs_rt15 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_rt15
kepon72 25 Messages postés jeudi 23 avril 2009Date d'inscription 27 novembre 2011 Dernière intervention - 20 nov. 2011 à 10:24
0
Merci
Avec GetLastError(); j'ai une erreur 125 de renvoyer.
Quelqu'un a t-il une idée ?
Commenter la réponse de kepon72
mogwai93 361 Messages postés mardi 31 décembre 2002Date d'inscription 19 mars 2015 Dernière intervention - 20 nov. 2011 à 17:49
0
Merci
regarde ici

c'est la liste des erreurs retournées par getlasterror
Commenter la réponse de mogwai93
kepon72 25 Messages postés jeudi 23 avril 2009Date d'inscription 27 novembre 2011 Dernière intervention - 20 nov. 2011 à 18:58
0
Merci
Merci beaucoup ! J'ai galérer pendant un moment...
Commenter la réponse de kepon72

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.