2010-08-24 12 views
9

Estoy aceptando la ruta a través de la entrada de la línea de comandos.Abra el directorio usando C

Cuando hago

dir=opendir(args[1]); 
it doesnt enter the loop...i.e dir==null... 

¿Cómo pasar la entrada de línea de comandos para dir puntero ???

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 
+2

Proporcione la parte correspondiente de su código. Tu pregunta no está clara, al menos para mí. 'opendir' devuelve un' DIR * '. Devuelve NULL en 2 situaciones: no se pudo acceder al directorio o no se pudo asignar memoria para contener el resultado. – jweyrich

+0

@Vinod K: ¿Cómo está ejecutando este código/qué línea de comando está utilizando para ejecutarlo? – Thanatos

+0

@Vinod: Imprime args [1] y comprueba manualmente si existe. 1) ¿Existe? 2) ¿Su ruta encaja en 50 bytes (debe usar strncpy)? 3) ¿Qué sucede si no pasas el parámetro? Agregue las condiciones adecuadas allí. – jweyrich

Respuesta

30

que realmente debe publicar su código, pero aquí va. Inicio con:

#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; 
    } 

Es necesario comprobar en su caso que es a la vez args[1] conjunto y se refiere a un directorio real. Cuando esto se ejecuta con:

testprog tmp 

(tmp es un subdirectorio de mi directorio actual, pero se puede utilizar cualquier directorio válido), me sale:

[.] 
[..] 
[file1.txt] 
[file1_file1.txt] 
[file2.avi] 
[file2_file2.avi] 
[file3.b.txt] 
[file3_file3.b.txt] 

Tenga en cuenta que usted tiene que pasar un directorio en, no un archivo . cuando ejecuto:

testprog tmp/file1.txt 

me sale:

Cannot open directory 'tmp/file1.txt' 

porque eso es un archivo en lugar de un directorio (si eres astuto, puede intentar utilizar diropen(dirname(v[1])) si el inicial diropen falla).

+0

Quise decir que fue ... en lugar de pDir = opendir ("Hardcoding the path") nos puede gustar poner pDir = opendir (args [1]) ¿Cuál ingresa el usuario? –

+0

@Vinod, sí, mira la actualización. – paxdiablo

+0

¿Cómo se evita cruzar en [.] Y [..]? – jaytj95

1

Algunos comentarios sobre el segmento de código, aunque en su mayor parte, que debería funcionar ...

void main(int c,char **args) 
  • int main - el estándar define como main devolver un int.
  • c y args están normalmente denominado argc y argv, respetuosa, pero se le permite a ellos nombrar nada

...

{ 
DIR *dir; 
struct dirent *dent; 
char buffer[50]; 
strcpy(buffer,args[1]); 
  • Usted tiene un desbordamiento de búfer aquí: Si args[1] tiene más de 50 bytes, buffer no podrá retenerlo y usted escribirá en la memoria que no debería contenerlo. No hay ninguna razón que puedo ver a copiar el búfer de aquí, por lo que puede dejar de lado estas cuestiones simplemente no usando strcpy ...

...

dir=opendir(buffer); //this part 

Si esta volviendo NULL, puede ser por algunas razones:

  • El directorio no existe. (¿Lo escribiste bien?¿Tenía un espacio en ella, y que escribió ./your_program my directory, que se producirá un error, porque trata de opendir("my"))
  • vosotros tiene falta de permisos para el directorio
  • hay memoria suficiente. (Esto es poco probable.)
2

parámetros pasados ​​al programa ejecutable C no es más que un conjunto de cuerdas (o puntero de caracteres), por lo que la memoria habría sido ya asignados para estos parámetros de entrada antes de su acceso a los programas de estos parámetros, así que no hay necesidad de asignar buffer, y de esa manera puede evitar el código de manejo de errores en su programa también (Reduzca las posibilidades de segfault :)).

0

Aquí hay una manera simple de implementar el comando ls usando c. Para ejecutar el uso por ejemplo ./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); 
    } 
Cuestiones relacionadas