J'accepte le chemin via une entrée de ligne de commande.
Quand je fais
dir=opendir(args[1]);
il n’entre pas dans la boucle ... i.e dir==null
...
Comment passer l'entrée de ligne de commande au pointeur dir?
void main(int c,char **args)
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer, args[1]);
dir = opendir(buffer); //this part
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
printf(dent->d_name);
}
close(dir);
}
./a.out /root/TEST is used to run the program..
./a.out --> to execute the program
/root/TEST --> input by the user i.e valid path
Vous devriez vraiment poster votre code, mais voilà. Commencer avec:
#include <stdio.h>
#include <dirent.h>
int main (int c, char *v[]) {
int len;
struct dirent *pDirent;
DIR *pDir;
if (c < 2) {
printf ("Usage: testprog <dirname>\n");
return 1;
}
pDir = opendir (v[1]);
if (pDir == NULL) {
printf ("Cannot open directory '%s'\n", v[1]);
return 1;
}
while ((pDirent = readdir(pDir)) != NULL) {
printf ("[%s]\n", pDirent->d_name);
}
closedir (pDir);
return 0;
}
Vous devez vérifier dans votre cas que args[1]
est défini et fait référence à un répertoire réel. Quand cela est exécuté avec:
testprog tmp
(tmp
est un sous-répertoire de mon répertoire actuel mais vous pouvez utiliser n'importe quel répertoire valide), je reçois:
[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
Notez que vous devez passer un répertoire directory in, pas un fichier. Quand j'exécute:
testprog tmp/file1.txt
Je reçois:
Cannot open directory 'tmp/file1.txt'
parce que c'est un fichier plutôt qu'un répertoire (si vous êtes sournois, vous pouvez essayer d'utiliser diropen(dirname(v[1]))
si la diropen
initiale échoue).
Les paramètres transmis à l'exécutable du programme C ne sont rien d'autre qu'un tableau de chaîne (ou un pointeur de caractère), de sorte que la mémoire aurait déjà été allouée pour ces paramètres d'entrée avant que votre programme n'accède à ces paramètres. Vous n'avez donc pas besoin d'allouer de mémoire tampon. évitez également le code de traitement des erreurs dans votre programme (réduisez les risques de segfault :)).
Quelques commentaires sur le segment de code, bien que pour la plupart, cela devrait fonctionner ...
void main(int c,char **args)
int main
- la norme définit main
comme renvoyant une int
.c
et args
sont généralement nommés argc
et argv
, respectueusement, mais vous pouvez les nommer...
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
args[1]
est plus long que 50 octets, buffer
ne pourra pas le contenir et vous écrirez en mémoire de manière inattendue. Je ne vois aucune raison de copier le tampon ici. Vous pouvez donc éviter ces problèmes simplement en n'utilisant pas strcpy
......
dir=opendir(buffer); //this part
Si cela retourne NULL
, cela peut être pour plusieurs raisons:
./your_program my directory
, ce qui échouera, car il essaie de opendir("my")
)Voici un moyen simple d'implémenter la commande ls
à l'aide de c
. Pour utiliser, utilisez par exemple ./xls /tmp
#include<stdio.h>
#include <dirent.h>
void main(int argc,char *argv[])
{
DIR *dir;
struct dirent *dent;
dir = opendir(argv[1]);
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
{
if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
{
}
else
{
printf(dent->d_name);
printf("\n");
}
}
}
close(dir);
}