web-dev-qa-db-fra.com

Ouvrir le répertoire en utilisant C

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
14
Vinod K

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).

39
paxdiablo

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 :)).

2
Anil Vishnoi

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]);
  • Vous avez un dépassement de tampon ici: si 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:

  • Le répertoire n'existait pas. (L'avez-vous tapé correctement? Est-ce qu'il y avait un espace, et vous avez tapé ./your_program my directory, ce qui échouera, car il essaie de opendir("my"))
  • Il vous manque des permissions sur le répertoire
  • La mémoire est insuffisante. (C'est peu probable.)
1
Thanatos

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);
     }
0
Vijay S B