[WikiDyd] [TitleIndex] [WordIndex

Przykład użycia funkcji readdir i opendir

   1 /* Program demonstrujacy wykorzystanie opendir/readdir
   2    do wypisywania zawartosci katalogu
   3    jstar@iem.pw.edu.pl   wer. 1.0
   4 */
   5 #include <sys/types.h>
   6 #include <dirent.h>
   7 #include <string.h>
   8 #include <stdio.h>
   9 #include <errno.h>
  10                                                                                                                                                             
  11 void listdir( char * path, int level )
  12 /* Wypisz zawartosc katalogu path, stosujac level do okreslenia poziomu wciecia.
  13    Funkcja rekurencyjna.
  14                                                                                                                                                             
  15    Uwagi: funkcja nie jest idealna, bo trzyma otwarty katalog biezacy i schodzi
  16           w podkatalogi. Jezeli bedziemy mieli bardzo zaglebiona strukture, 
  17           to moze wystapic blad "too many open files".
  18           Dlatego lepiej byloby zapakowac wszystko do tablicy , zamknac biezacy
  19           i dopiero potem przegladac pozycje.
  20 */
  21 {
  22   char namebuf[1024];    /* bufor do tworzenia nazw podkatalogow */
  23   struct dirent *entry;  /* zm. robocza do iteracji po pozycjach w katalogu */
  24                                                                                                                                                             
  25   DIR *thisdir= opendir( path );  /* proba otwarcia */
  26                                                                                                                                                             
  27   if( thisdir == NULL ) {  /* nie udalo sie otwaorzyc path jako katalogu */
  28     if( errno != ENOTDIR ) /* ignorujemy blad ENOTDIR (nie-katalog) 
  29                               - inne bledy zglaszamy */
  30       fprintf( stderr, "readdirtest: %s : %s\n", path, strerror(errno) );
  31     return;
  32   }
  33                                                                                                                                                             
  34   while( (entry= readdir( thisdir )) != NULL ) { /* czytamy kolejne pozycje */
  35     register int i;
  36     for( i= 0; i < level; i++ )   /* odpowiednie wciecie */
  37       printf( "\t" );
  38     printf( "%s\n", entry->d_name ); /* wypisanie nazwy */
  39                                                                                                                                                             
  40     /* jesli to nie jest "." ani "..", to probujemy wypisac zawartosc */
  41     if( strcmp( entry->d_name, "." ) != 0 
  42      && strcmp( entry->d_name, ".." ) != 0 ) {
  43       strcpy( namebuf, path );          /* tworzymy nazwe */
  44       strcat( namebuf, "/" );
  45       strcat( namebuf, entry->d_name );
  46       listdir( namebuf, level+1 );      /* i wywolujemy rekurencyjnie listdir */
  47     }
  48   }
  49   closedir( thisdir ); /* na koniec zamykamy katalog */
  50 }
  51 
  52 int
  53 main( int argc, char **argv )
  54 {
  55   if( argc == 1 )  /* po wywowolaniu bez argumentow wypisujemy biezacy katalog */
  56     listdir( ".", 0 );
  57                                                                                                                                                             
  58   while( --argc ) {
  59     printf( "%s\n", *argv );
  60     listdir( *++argv, 1 );
  61   }
  62   return 0;
  63 }

2015-09-23 06:44