2011-04-20 4 views
4

Comment lire le contenu (sous-répertoires et noms de fichiers) d'un répertoire utilisant le langage C sous Linux.Lecture du contenu du répertoire sous Linux

+2

Montrez-nous le code de l'endroit où vous êtes frappé de telle sorte que quelqu'un peut vous aider. Et explique le problème avec le code actuel que vous avez. – Mahesh

Répondre

4

Les fonctions pertinentes sont opendir, readdir et closedir. Je recommande "man opendir" etc

2

Voici le code qui va le faire (tiré de link), j'espère que cela vous permettra de commencer ce que vous cherchez.

#include <ftw.h> 
#include <stdio.h> 
#include <sys/stat.h> 

int list(const char *name, const struct stat *status, int type); 

int main(int argc, char *argv[]) { 

if(argc == 1) 
    ftw(".", list, 1); 
else 
    ftw(argv[1], list, 1); 

return 0; 
} 

// FTW_F The object is a file 
// FTW_D ,, ,, ,, ,, directory 
// FTW_DNR ,, ,, ,, ,, directory that could not be read 
// FTW_SL ,, ,, ,, ,, symbolic link 
// FTW_NS The object is NOT a symbolic link and is one for 
//   which stat() could not be executed 
int list(const char *name, const struct stat *status, int type) { 
if(type == FTW_NS) 
    return 0; 

if(type == FTW_F) 
    printf("0%3o\t%s\n", status->st_mode&0777, name); 

if(type == FTW_D && strcmp(".", name) != 0) 
    printf("0%3o\t%s/\n", status->st_mode&0777, name); 

return 0; 
} 

Edit: FTW est ce qui est utilisé pour marcher le système de fichiers, pour plus d'informations à ce sujet s'il vous plaît se référer à sa page man ftw man page

+2

+1 pour compenser l'insensé -1. 'ftw' ** lit ** un répertoire. –

+0

Plus 1 à R. pour le bon commentaire, ftw et nftw lisent tous deux les répertoires. –

6

Voici un programme récursif d'imprimer le nom de tous les sous-répertoires et fichiers récursive .
Utilisation: nom de chemin ./a.out
Les conditions d'erreur ne sont pas vérifiées pour le nom de chemin d'accès initial fourni en tant qu'argument de ligne de commande.
Flux de code de base:
Toutes les entrées du répertoire courant sont lues.
si c'est le nom du répertoire, son nom est ajouté au nom du chemin et la fonction est appelée récursivement.
L'autre nom des fichiers est imprimé.

détails sur les fonctions particulières peuvent être référencées dans les pages de manuel respectives comme l'a par dmuir:

#include<sys/stat.h> 
#include<unistd.h> 
#include<dirent.h> 
#include<error.h> 
int read(char *pth) 
{ 
    char path[1000]; 
    strcpy(path,pth); 
    DIR *dp; 
    struct dirent *files; 
    /*structure for storing inode numbers and files in dir 
    struct dirent 
    { 
     ino_t d_ino; 
     char d_name[NAME_MAX+1] 
    } 
    */ 
    if((dp=opendir(path))==NULL) 
     perror("dir\n"); 
    char newp[1000]; 
    struct stat buf; 
    while((files=readdir(dp))!=NULL) 
    { 
       if(!strcmp(files->d_name,".") || !strcmp(files->d_name,"..")) 
       continue; 

     strcpy(newp,path); 
     strcat(newp,"/"); 
     strcat(newp,files->d_name); 
      printf("%s\n",newp); 

      //stat function return a structure of information about the file  
     if(stat(newp,&buf)==-1) 
     perror("stat"); 
     if(S_ISDIR(buf.st_mode))// if directory, then add a "/" to current path 
     { 

      strcat(path,"/"); 
      strcat(path,files->d_name); 
      read(path); 
      strcpy(path,pth); 
     } 
    } 
} 
int main(int argc,char *argv[]) 
{ 

    read(argv[1]); 
} 
Questions connexes