Newsgroup: it.comp.lang.c++
Titolo: Scansione Dir - Seconda parte

Ciao a tutti,
apro un nuovo post sulla scansioni delle directory.
Mi hanno dato del codice e sono arrivato fino a questo punto
#include <dirent.h>
#include <iostream>
using std::cout;
using std::endl;
int main(){
	const char *homeDir ("C:/");
	DIR *directory = opendir(homeDir);
	while (dirent *scansione = readdir(directory)){
		cout << scansione->d_name << endl;
	}
	closedir(directory);
}
Ho cercato di capire come accedere alla varie sotto directory ma non
l'ho capito
Ho guardato la documentazione di queste funzioni
closedir(), opendir(), readdir(), rewinddir(), seekdir(), telldir(),
<sys/types.h>
ma non ho trovato nulla che mi potesse interessare
Per logica ho cercato qui,
	while (dirent *scansione = readdir(directory)){
		cout << scansione->d_name << endl;
	}
dal momento che mi permette di leggere i file di una dir
mi aspettavo qualcosa del genere
scansione->d_directory ( o simili)
ma nulla.
Mi date qualche altra dritta?
Ciao
Lele

<sys/types.h>
da man readdir:
struct dirent {
	...
	unsigned char d_type; /* type of file */
	...
 };
 ...
DT_DIR      This is a directory.
 ...
Quindi basta che fai un controllo del tipo
	if(scansione->d_type == DT_DIR)
		scan_dir(scansione->d_name);
dove scan_dir è la tua funzione di scanning.

 da man readdir:
"Only  the  fields  d_name and d_ino are specified in POSIX.1-2001."
Non so quanto possa effettivamente interessare seguire lo standard
posix, ma giusto per completezza.
Enrico


Si hai perfettamente ragione. 
Se c'è la necessità di seguire lo standard posix allora credo che 
l'unica via sia controllare tramite 'stat'.

 if(scansione->d_type == DT_DIR)
Ho provato banalmente a scrivere esattamente cosi
Ma non funziona.
Ho scritto varie combinazioni, ma segnala SEMPRE
unused variable 'DT_DIR'
Come è possibile?
Cosa mi dici di dirfd e di fchdir
Non possono servire al mio caso?
Puoi darmi maggiori informazioni?
Ciao e grazie
Lele

 Puoi darmi maggiori informazioni?
guarda la documentazione della funzione stat, con man stat, oppure qui
http://linux.die.net/man/2/stat

 
http://linux.die.net/man/2/stat
Sto dando un occhiata ma è ampiamente al di fuori delle mie competenze.
Va bhe... vedremo che fare.
Grazie
Lele

 dove scan_dir è la tua funzione di scanning.
Inizio a capire questo è codice per Linux/Unix su win32 non funziona.
Quello che sto cercando di fare è imparare a fare codice che non sia 
troppo dipendete da questo o quel OS.
Sai dove indirizzarmi?
Ciao
Lele

 Mi hanno dato del codice e sono arrivato fino a questo punto
Dunque, ora sai ricavare l'elenco dei file (anzi delle "entry") di una
directory. Per procedere, ti serve in primo luogo un sistema per distinguere
i file regolari dalle directory. Anche qui lo Standard non ci aiuta. Se
vuoi proseguire sulla strada che ti hanno indicato (ma che io
personalmente sconsiglio), dovrai studiarti le funzioni POSIX per ricavare
le informazioni relative a un file. Queste funzioni sono stat/lstat. Una
volta che sai se un certo percorso denota una directory, l'approccio
concettualmente più semplice è applicare la stessa procedura iniziale
ricorsivamente. Più interessante e didattico sarà invece realizzare lo
stesso compito *senza* ricorrere a chiamate ricorsive. (Mantenendo quindi
un proprio stack con i percorsi intermedi che vengono via via esaminati.)
Ribadisco che secondo me Boost.Filesystem resta la scelta più logica. Tra
l'altro, con Boost avresti anche uno speciale iteratore ricorsivo, che fa
precisamente quello che ti serve. Ricordo, per altro, che discutere di
robe POSIX in questo NG è OT. Discutere di Boost no.
Max

 Sai dove indirizzarmi?
Te lo hanno già detto.
Boost offre alcune soluzioni cross-platform. Oppure installi su Windows
librerie per dargli uno strato di compatibilità POSIX.
L'ultima possibilità è...
def list_directory(directory):
    for root, files, dirs in os.walk(directory):
        print root, ':'
        for f in files: print '\t', f
        for d in dirs: print '\t', d
        print
Ma questo ovviamente non è c++.
-- 
-riko

 librerie per dargli uno strato di compatibilità POSIX.
Volentieri hai un link sotto mano?
Sotto Linux da quel che ho capito sono installate insieme build-essential.
Ciao e Grazie
Lele

 Discutere di Boost no.
Perché?
Sono due cose talmente diverse?
Tra qualche giorno torno alla carica con Boost.
Grazie mille per il tuo interesse.
Lele


Si.
POSIX, a differenza di C++, definisce un insieme "completo" di API per 
l'accesso ai servizi offerti da un sistema operativo e, storicamente, è 
nato con lo scopo di unificare l'API dei vari sistemi derivati UNIX.
Comunque tutti i sistemi noti supportano, in parte o minima parte, POSIX.
http://en.wikipedia.org/wiki/POSIX
http://en.wikipedia.org/wiki/Unix_wars
http://en.wikipedia.org/wiki/Single_UNIX_Specification
 
Manlio Perillo

 era difficile da apprendere.
Come ho detto, ci sono parti di Boost che sicuramente sono inacessibili per
un neofita (e anche per molti che neofiti non sono). Ma non è necessario
capire tutte le librerie di Boost per usarne qualcuna. Mi pare (ma magari
mi sbaglio, eh) che Boost.Filesystem sia abbastanza comprensibile e usabile
anche per un neofita. Perché non ci dai uno sguardo e ce lo dici? Nota che
qualsiasi difficoltà che trovi e che affronti nello studiare
Boost.Filesystem ti fa crescere come programmatore C++. Non direi lo stesso
per lo studio delle API POSIX.
Max

 Come ho detto, [...]
Scusate, in realtà non l'avevo mai detto. L'avevo scritto un post in
risposta ad Andrea, che è però rimasto nelle bozze, e lì ormai resterà.
Max