Newsgroup: it.comp.lang.c++
Titolo: elenco dei files in una directory

Ciao!
Devo aprire, uno per uno, tutti i files di una directory (in Linux :-) ).
Vorrei farlo in C++, visto che il programma e' tutto in C++ :-)
Allora, uso un ifstream:
#include <fstream>
main()
{
 ifstream(?);
}
cosa ci metto al posto del punto di domanda!?
Ho visto, qua' e la', che posso passare anche un int, non necessariamente un
array di char.
Questo int cos'e'?? Una specie di Id??
Se si', se fosse possibile conoscere l'Id dell'ultimo file... penso sia, nel
mio caso, la soluzione ottimale: devo aprire tutti i files, ma non mi
importa il loro nome :-)
Grazie!!
--
Emanuele Cesena
d.a.m...@iol.it
           Attenti all'antispam NOSPAM
http://www.geocities.com/SiliconValley/Grid/8879
trovate ora l'editor per i livelli di Bubble2000!! :-))
ICQ n° #10570672

Esistono funzioni di libreria C che ti permettono di trovare tutti i file in una
directory (findfirst() e findnext(), dovresti trovare l'help in maniera
abbastanza semplice). Atttraverso le strutture coinvolte risali molto facilmente
al nome del file, per cui hai anche il puntatore a char che ti interessa per
aprirlo.
Flavio.
--
Flavio Poletti
e-mail:   
pol...@writeme.com
web page: 
http://poletti.freeweb.org/
La libertà [americana] è lì, alla portata di tutti...
     ... come la chitarra ....
... ognuno suona come vuole ...
     ... e tutti suonano come vuole la libertà!
                                  (G. Gaber)


Avevo cercato findfirst (sperando in un'affinita' col Pascal), ma non
l'avevo trovato...
comunque se mi dici che e' cosi', riprovero' :-)
Ma tutto da C++ non si riesce a farlo?? :-)


 
findfirst() e findnext() sono funzioni tipiche delle librerie MS-DOS/Win.
Sotto Unix devi usare:
	opendir(), readdir(), ... (vedi man opendir)
Se esistono delle funzioni standard C++, non le conosco. Con le Win95/MFC
si puo usare la classe CFileFind (ovviamente non standard). Puoi sempre
costruire una classe front-end per la opendir().
ifstream: il costruttore ifstream(int fd) associa l'ifstream ad un file
gia' aperto, dove fd e' il descrittore, cioe' l'indice nella tabella dei
file di un processo. L'I/O sotto Unix e' strutturato in due livelli:
- Livello 1: file 'grezzi', senza buffer, gestiti da open(), close, read(),
write() - sono identificati da 'file descriptor' (interi) e le funzioni che
li gestiscono sono system call
	stdin	-> fd=0
	stdout -> fd=1
	stderr -> fd=2
- Livello 2: di tipo 'FILE *', forniscono buffer e funzioni di alto livello
(fgets(), ...) fornite dalla libreria e si appoggiano sul livello 1
Un ifstream puo' essere associato ai file di livello 2. Per usare
ifstream(int):
int fd=open(....);
ifstream stream(fd);
Saluti, Alberto.

Ma tutto da C++ non si riesce a farlo?? :-)
Il C++ Standard, come il C Standard, non fornisce
alcun modo per accedere all'"elenco dei files in una
directory".  In entrambi i linguaggi, bisogna fare
invece ricorso a funzionalita` non-standard che siano
parte delle librerie o framework utilizzate.
Ad esempio, le API di Win32 forniscono FindFirstFile,
FindNextFile, FindClose (accessibili da C, C++, e ogni
altro linguaggio che possa chiamare le API Win32; il
framework MFC offre la classe CFileFind (accessibile
da C++); e cosi` via.
Quindi, la risposta alla tua domanda dipende dalla
interpretazione che si vuol dare a "in C++": se vuoi
dire C++ standard e perfettamente portabile, no, la
funzionalita` in questione non e` presente, come non
lo e` in C; se non hai il requisito di portabilita`, allora
si`, vari framework e librerie te lo permettono.
Alex

Un bel di' Alex Martelli scrisse:
AM> Il C++ Standard, come il C Standard, non fornisce
AM> alcun modo per accedere all'"elenco dei files in una
AM> directory".  In entrambi i linguaggi, bisogna fare
AM> invece ricorso a funzionalita` non-standard che siano
AM> parte delle librerie o framework utilizzate.
AM> 
capisco :-)
AM> Ad esempio, le API di Win32 forniscono FindFirstFile,
AM> FindNextFile, FindClose (accessibili da C, C++, e ogni
AM> altro linguaggio che possa chiamare le API Win32; il
AM> framework MFC offre la classe CFileFind (accessibile
AM> da C++); e cosi` via.
AM> 
questo, ahime', non e' il mio caso
AM> Quindi, la risposta alla tua domanda dipende dalla
AM> interpretazione che si vuol dare a "in C++": se vuoi
AM> dire C++ standard e perfettamente portabile, no, la
AM> funzionalita` in questione non e` presente, come non
AM> lo e` in C; se non hai il requisito di portabilita`, allora
AM> si`, vari framework e librerie te lo permettono.
AM> 
perfetto, ora dovrei esserci
Grazie ancora
-- 
"Se non t'importa dove sei, non ti sei perso", regola di Rune
-- 
Emanuele Cesena
d.a.m...@iol.it
    occhio all'antispam NOSPAM!
http://www.geocities.com/SiliconValley/Grid/8879

Un bel di' Alberto Chessa scrisse:
AC> findfirst() e findnext() sono funzioni tipiche delle librerie MS-DOS/Win.
AC> Sotto Unix devi usare:
AC> 	opendir(), readdir(), ... (vedi man opendir)
AC>
ok, grazie :-)
ho controllato... ci sono, ora ci studio un po' :-)
AC> Se esistono delle funzioni standard C++, non le conosco. Con le Win95/MFC
AC> si puo usare la classe CFileFind (ovviamente non standard). Puoi sempre
AC> costruire una classe front-end per la opendir().
AC> 
no, "purtroppo" sono in Linux (ora mi sorge il dubbio di non averlo
detto...) :-)
AC> 
AC> ifstream: il costruttore ifstream(int fd) associa l'ifstream ad un file
AC> gia' aperto, dove fd e' il descrittore, cioe' l'indice nella tabella dei
AC> file di un processo. L'I/O sotto Unix e' strutturato in due livelli:
AC> - Livello 1: file 'grezzi', senza buffer, gestiti da open(), close, read(),
AC> write() - sono identificati da 'file descriptor' (interi) e le funzioni che
AC> li gestiscono sono system call
AC> 	stdin	-> fd=0
AC> 	stdout -> fd=1
AC> 	stderr -> fd=2
AC> 
si' :-)
AC> - Livello 2: di tipo 'FILE *', forniscono buffer e funzioni di alto livello
AC> (fgets(), ...) fornite dalla libreria e si appoggiano sul livello 1
AC> 
AC> Un ifstream puo' essere associato ai file di livello 2. Per usare
AC> ifstream(int):
AC> 
AC> int fd=open(....);
AC> 
AC> ifstream stream(fd);
AC> 
ah, ho capito... insomma non centrava nulla con quello che ho detto io :-)
AC> 
AC> Saluti, Alberto.
AC> 
-- 
"10. Non dare mai ordini per iscritto", dal decalogo di Spark per il giovane
manager
