Problème avec le nom d'éxécutable

Résolu/Fermé
Utilisateur anonyme - 2 mars 2016 à 12:20
 Utilisateur anonyme - 3 mars 2016 à 00:42
Bonjour,

Voila, j'ai crée un programme listant tous les noms de fichiers/dossiers dans le répértoire où se trouve l'éxécutable, différenciant les fichiers des dossiers, pour après donner leur taille sur le disque dur en octet (ceci n'est pas encore fait dans le code). Mais voila j'ai un problème : même s'il n'y a aucune raison, si l'utilisateur renomme l'éxécutable, alors le programme plante, je sais que c'est assez fragile... Voila le code :

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <windows.h>
#include <winbase.h>

int main()
{

    int nb = 0, j = 0, i = 0;
    DIR* repertoire = NULL;

    char Path[80]; //(*) Contiendra le chemin de l'éxécutable, sans le nom de ce dernier : C:/Users/username/Desktop/
    char fullUse[80]; //(**) Contiendra le chemin de l'éxécutable, avec le nom de ce dernier : C:/Users/username/Desktop/sizeit.exe
    char ref[20]; //Contiendra le nom de l'éxecutable : sizeit.exe
    GetModuleFileName(0,Path,80); //(*)
    GetModuleFileName(0,fullUse,80); // (**)

    j = strlen(Path); //Taille de la chaine de caractères correspondant au chemin de l'éxécutable (Path).
    Path[j-10] = '\0'; //Suppression des dix derniers caractères en coupant la chaine, pour obtenir le chemin seul, sans l'éxécutable.

    struct dirent* read = NULL;
    repertoire = opendir(Path); //Indication du répértoire dans lequel se placer, ici le répértoire actuel de l'éxécutable.

    printf("Repertoire : %s\n\n", Path);

    if (repertoire == NULL)
        perror(""); //Eventuelles erreurs.

   while ((read = readdir(repertoire)) != NULL)
   {
     if (strcmp(read->d_name, ".") != 0 && strcmp(read->d_name, "..") != 0) //On ne compte pas "." et ".." dans le répértoire.
     {
     nb++; //Compteur de nombre d'éléments dans le répértoire.
     if(strstr(fullUse, read->d_name) != NULL)
     {
     sprintf(ref, read->d_name); //Mise à part de l'éxécutable dans la liste des fichiers.
     }
     else if(strchr(read->d_name,  '.') != 0) //Identification des fichiers.
     {
     printf("%s (fichier)\n", read->d_name);
     }
     else //Identifications des dossiers.
     {
     printf("%s (dossier)\n", read->d_name);
     }
     }
   }
    if (closedir(repertoire) == -1)
    perror(""); //Eventuelles erreurs.

    printf("-------------------------------\n%s (executable SizeIt)", ref); //Affichage du nom de l'éxécutable en dernier.

    printf("\n\nIl y a %d element(s) dans ce repertoire\n", nb);
    getch();
   return 0;
}


Voici le résultat de la console lorsque tout ce passe bien :

Repertoire : C:\Users\username\Projets\SizeIt\bin\Debug\

72144139.jpg (fichier)
Build.log.txt (fichier)
new (dossier)
screenccm.PNG (fichier)
-------------------------------
SizeIt.exe (executable SizeIt)

Il y a 5 element(s) dans ce repertoire


Voici le résultat si le nom de l'éxécutable est changé :

Repertoire : C:\Users\username\Projets\SizeIt\bin\Deb

No such file or directory
Bad address
-------------------------------
ë⌠îv (executable SizeIt)

Il y a 0 element(s) dans ce repertoire


Le problème vient de ce bout de code très fragile, me permettant d'avoir l'adresse sans le nom de l'éxécutable :
Path[j-10] = '\0'; //Suppression des dix derniers caractères en coupant la chaine, pour obtenir le chemin seul, sans l'éxécutable.


Je ne sais pas comment faire autrement, si quelqu'un peut m'aider...

Merci.


1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
3 mars 2016 à 00:25
Bonjour
Le nom de l'executable est toujours précédé d'un slash ou d'un antislash, il suffit de le rechercher et de le remplacer par un '\0'
for ( char* p = Path+strlen(Path) - 1 ; p >= Path ; --p )
{
    if ( *p == '\\' || *p == '/' )
    {
        *p = '\0';
        break;
    }
}
0
Utilisateur anonyme
3 mars 2016 à 00:42
Nickel, merci. Sujet resolu.
0