Newsgroup: it.comp.os.linux.development
Titolo: [debian] problema con dirent

Ciao
Ho da poco istallato una Debian (potato 2.2r3)  sul mio computer,
tutto e' andato benissimo e sono piu' che contento di questa
distribuzione.
Ieri ho provato a ricompilare un mio piccolo programmino che utilizza
le libc e in particolare la funzione readdir() che riempie la
struttura dirent la quale contiene informazioni sul contenuto (file o
altre directory) di una directory specificata. Purtroppo la struttura
sembra mancare del membro d_type che identifica il tipo di file che si
sta esaminando( link, directory, ecc...), o meglio il membro esite ma
sembra essere vuoto (se provo a stamparlo su schermo non stampa
nulla).
Sulla mandrake che usavo prima tutto filava a meraviglia.
Qualcuno sa darmi una mano?
Ciao.
-- 
cageka...@katamail.com
Autoproclamatosi fan n° 1 di Sucaman.
http://utenti.tripod.it/fumettieanimazione/
Rimuovete katamiati dalla mia e-mail se volete scrivermi.

 sembra essere vuoto (se provo a stamparlo su schermo non stampa
Penso che ti venga ritornato DT_UNKNOWN (cioč 0). In questo caso ti
servono altre strategie per recuperare le informazioni sull'entry. Non
so quanto sia praticabile nel tuo caso, ma una potrebbe essere usare
stat() e controllare lo st_mode della struttura stat che ti viene
restituita (ci sono macro per convertire da d_type a st_mode e
viceversa... `info libc').
Ciao
 David
-- 
<d.santinoli presso mi . flashnet . it>

viceversa... `info libc').
Ok ho visto la documentazione e questa sarebbe una soluzione capace di
salvare capra e cavoli con poche modifiche; continuo pero' a chiedermi
perche su un'altra distribuzione la cosa funzionasse: e' un problema
di versione delle libc?
Grazie cmq, mi hai salvato il progetto. :)
Ciao


viceversa... `info libc').
Macche' ho provato a fare come dici tu: passare a stat la stringa
corrispondente al file da esaminare riempiendo l'omonima struttura e
usare la macro IFTODT per convertire il membro st_mode in d_type;
infine controllare se si tratti una directory nel solito modo (se e'
uguale a DT_DIR).
In questo modo mi restituisce 4 (e' una directory) anche per file che
non lo sono (infatti il programma lancia un'eccezione perche' cerca di
aprire una dir che non esiste).
Lo stesso accade se uso la macro S_ISDIR su st_mode: tutte directory.
A questo punto non so piu' che fare dove sbaglio?
Eppure la documentazione parla chiaro! :-(
Vabbe' grazie di tutto lo stesso.


 Eppure la documentazione parla chiaro! :-(
Potresti postare i frammenti piu` significativi del codice?


Potresti postare i frammenti piu` significativi del codice?
Certamente! Il programma e' scritto in c++ per cui quella che segue
e', in effetti, una funzione membro di una classe; cmq credo che possa
essere comprensibile  anche da sola.
Quello che dovrebbe fare e' scansire ricorsivamente un filesystem e'
passare le directory alla funzione process_dir e i file a process_file
La versione e' quella che ho modificato secondo i tuoi consigli e che
genera l'eccezione perche considera tutto cio che incontra come
directory.
Mentre quella non modificata si fermava al primo livello di
profondita' dato che considerava le directory come file.
Solo una nota: so che non e' un codice molto pulito, ma non sono un
programmatore di professione.:) 
Inoltre ti ringrazio sinceramente per l'aiuto che mi stai dando.:)
/*--------------------------*/
  void scan_for_file(const char* cartella){ //throw std::runtime_error
    string stdcart=cartella;
      if(stdcart[stdcart.size()-1]=='/'){
	stdcart=stdcart.substr(0,stdcart.size()-1);
      }
 
    DIR* dirstrm=opendir(cartella);
      if (dirstrm==0){
         string eccwhat="Impossibile aprire la directory: " + stdcart;
         throw std::runtime_error(eccwhat);
      }
    dirent* filecorrente;  
      while( ( filecorrente=readdir( dirstrm ) )!=0 ){
         string lastdir=filecorrente->d_name;
         struct stat fattributi;
	 string newpat=cartella + '/'+ lastdir;
	 stat(newpat.c_str(),&fattributi);
         int dirtipo=IFTODT(fattributi.st_mode);          
	 cout << lastdir <<" "<< dirtipo <<endl; //da sempre 4
         if( (dirtipo==DT_DIR) && 
	     (lastdir!=".." && lastdir!=".") ){
           string newcart=filecorrente->d_name;
	   string newpath=stdcart+ '/'+ newcart;
           _count++;
            try{
              process_dir(newpath.c_str());
	    }catch(std::runtime_error &exc){
	      string excew=exc.what();
	      cout <<"Eccezione sollevata: "<< excew <<endl;
	    } 
           scan_for_file(newpath.c_str()); 
         }else if (!(lastdir==".." || lastdir=="." ) ){
	   process_file(lastdir.c_str());
         }      
      }
      _count--;
      if(_count >= 0){
	fine_livello();
