Problème avec le nom d'éxécutable
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
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 :
Voici le résultat de la console lorsque tout ce passe bien :
Voici le résultat si le nom de l'éxécutable est changé :
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 :
Je ne sais pas comment faire autrement, si quelqu'un peut m'aider...
Merci.
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.
A voir également:
- Problème avec le nom d'éxécutable
- Nom de l'adresse - Forum Réseaux sociaux
- Changer le nom de son iphone - Guide
- Nom sonnerie iphone - Forum iPhone
- Dans le document à télécharger, trouvez les lettres situées derrière les rectangles pour reconstituer le nom du chat. comment s'appelle-t-il ? - Forum InDesign
- Trouver le nom d'une personne avec son adresse - Forum Réseaux sociaux
1 réponse
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'
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; } }
Utilisateur anonyme
Nickel, merci. Sujet resolu.