Newsgroup: it.comp.lang.c++
Titolo: Discriminare Directory dai File

Salve,
non riesco a capire come leggere e discriminare il contenuto di una 
directory windows.
Vorrei creare una funzione che, dato un path, elenca solo le directory in 
essa contenuta o solo i file.
Grazie
    igino76 

 ha scritto nel messaggio 
news:48c24a58$0$1084$4faf...@reader2.news.tin.it...



cerca "dirent.h"
E.

 deduco che probabilmente e' una cosa impossibile!
Dalla domanda, invece, io deduco che tu non abbia nemmeno dato uno sguardo
ai messaggi dell'ultima settimana. :)
M

 E.
Ciao,
ho scritto il seguente codice:
DIR *dir = opendir(".");
struct dirent *ent;
while ((ent = readdir(dir)) != NULL)
{
        cout << (ent -> d_name)      << " "    //  visualizza il nome
               << (ent -> d_ino)          << " "    //  cosa e' il numero 
inode???
               << (ent -> d_namlen)    << " "    //  visualizza la lunghezza 
del nome
               << (ent -> d_reclen)     << "\n";  //  cosa visualizza???
}
ma non trovo nessuna propieta' della struttura che discrimina i file da 
directory!
Ho letto che la chiamata di sistema
int stat(const char *pathname, struct stat *buf);
permette di accedere in lettura alle informazioni e propieta' associate ad 
un file,
ma non riesco propio a capire come si fa!
Ho provato cosi' per visualizzare un discriminante ma niente ancora:
while ((ent = readdir(dir)) != NULL)
{
        struct stat sb;
        cout  << sb.st_mode <<  " " << (ent -> d_name)  << "\n ";
        cout << stat (ent -> d_name,  &sb)  << " ";
}
Help me!

 M
In effetti solo dopo aver postato ho letto i messaggi della settimana ;)
e con tutto cio' non ho ancora trovato la soluzione! :((
Bye

 }
E.

 e con tutto cio' non ho ancora trovato la soluzione! :((
Beh, nei due thread sono state date soluzioni più o meno indipendenti dalla
piattaforma, o almeno non troppo legate a una piattaforma. Se vuoi una
soluzione specifica per Windows, il NG giusto non è questo, ma
it.comp.programmare.win32.
M

 directory!
in un sistema POSIX dovrebbe valere:
int S_ISDIR (mode_t M)
     This macro returns non-zero if the file is a directory.
Perdonatemi ma non  ho letto nessun messaggio del  thread, potrei dire
sciocchezze o ripetermi!
Ciao!
C!
-- 
La scienza non si occupa delle categorie cui compete il ridicolo
-- S. Lem

igino76 wrote:

Puoi usare boost
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
...
path pth("percorso");
if( is_directory(pth) ) {...}
Per elencare le directory, guarda directory_iterator
-- 
* Matteo Gottardi | 
mat...@tin.it
* ICQ UIN 20381372
* Linux - the choice of a GNU generation
* GPG Fingerprint:
* B9EE 108F 52C8 D50C B667 B1F2 AB56 8A01 BA3D 36A1

Grazie a voi, con il codice giu', riesco a fare la discriminazione tra file 
e directory...
... ma come mai funziona solo per la directory in cui si trova l'eseguibile 
stesso?
Mi spiego meglio:
- L'eseguibile si trova in C:\
- Lancio il comando: eseguibile C:\
    OK. Tutto funziona correttamente.
- Lancio il comando: eseguibile C:\Windows
    NOK. File e Directory vengono considerati file
Come mai succede questo? Avete altri suggerimenti?
#include <iostream>
using std::cout;
#include <dirent.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
     if (argc != 2) return 0;
     struct stat buf;
     if (DIR *dir = opendir(argv[1]))
        {
         while (dirent *ent = readdir(dir))
               {
               cout << ent -> d_name << " ";
               stat(ent -> d_name, &buf);
               if (S_ISREG(buf.st_mode)) cout << " file\n"  ;
               else if (S_ISDIR(buf.st_mode)) cout << " directory\n";
               }
         closedir(dir);
         }
}

 l'eseguibile stesso?
Devi passare alla stat() anche il percorso completo del file o della 
directory e non il solo nome.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 directory e non il solo nome.
Risolto!
Grazie a tutti.