Newsgroup: it.comp.lang.c++
Titolo: [Urgente] Aprire tutti i file in una directory

Ciao a tutti, scusate il x-post, ma sono tiratissimo coi tempi!
Ho una directory, che contiene altre sottodirectory, ognuna delle
quali ha un certo numero di file.
Ebbene, io vorrei gardare dentro tutti questi file. Come faccio in
C/C++? Che funzioni di libreria mi servono?
Se sono due righe, sareste così gentili da scriverle?
Grazie mille a tutti, ciao
giulio
Per favore togliete "!RemoveMe!" dall'indirizzo per rispondere via email
Please remove "!RemoveMe!" from the address to email me

manca il Sistema operativo!
Unix & linux & BSD č una cosa,
Windows un'altra, DOS un'altra,
Mac un'altra ancora
--
____ __         __,_      __  _____
\  _\_ \  ___ _/ / /\  /\/  \/ / _/ It is better to reign in Hell
 \  _ \ \/ _ '/ , |\ VV / / / / _/ Than serve in Heaven.- MILTON
  \_,_/\_\_,_/_/|_| \__/\__/_/_/
      -- the one and only --     e-mail : 
blak...@tiscalinet.it
                                ICQ    : 59394345
The UNIX Guru's View of Sex:
$unzip;strip;touch;finger;mount;fsck;more;yes;umount;sleep

 
Puoi provare ad utilizzare una funzione ricorsiva come quella che ti
propongo sotto. Lo stile purtroppo non e' bello, ma la routine
funziona sia sotto Unix (HP e Linux) che sotto Windows. 
Considera che l'ho scritta 10 anni fa e non l'ho piu' modificata.
#define RC_SUCCESS      1
#define RC_ERROR        0
// -----------------------------------------
//
// -----------------------------------------
int ScanDir( const char *_path, const char *_extens, int (*Execute)(
const char *_path, const char *_ex )  )
{
  DIR                 *dirp;
  struct dirent       *direntp;
  struct stat         _st_stat;
  char                t_buf[1024];
  dirp = opendir( _path );
  if ( dirp == NULL )     
	return RC_ERROR;
  for(;;)
  {
    direntp = readdir( dirp );
    if( direntp == NULL ) 
      break;
 
    if ( strcmp(direntp->d_name, "." ) && strcmp(direntp->d_name, ".."
))
    {
#ifdef  _WIN32
      sprintf( t_buf, "%s\\%s", _path,direntp->d_name);
#else
      sprintf( t_buf, "%s/%s", _path,direntp->d_name);
#endif
      if ( stat( t_buf, &_st_stat ) )
      {
        closedir( dirp );
        return RC_ERROR;
      }
      if ( S_ISDIR(_st_stat.st_mode) )
      {
#if _DEBUG
        printf ( "\tScan directory %s \n", t_buf );
#endif
        if ( !ScanDir( t_buf , _extens, Execute ) )
        {
          closedir( dirp );
          return RC_ERROR;
        }
      }        
      else if ( strstr(direntp->d_name, _extens ) != NULL )
      {
        if ( !Execute( t_buf, _extens ) )
        {
          closedir( dirp );
          return RC_ERROR;
        }
      }
    }
  }
  closedir( dirp );
  return RC_SUCCESS;
}
Fausto

 wrote in message
38777F25...@freelance.it...
: Puoi provare ad utilizzare una funzione ricorsiva come quella che ti
: propongo sotto. Lo stile purtroppo non e' bello, ma la routine
: funziona sia sotto Unix (HP e Linux) che sotto Windows.
: Considera che l'ho scritta 10 anni fa e non l'ho piu' modificata.
[zak]
: #ifdef  _WIN32
:       sprintf( t_buf, "%s\\%s", _path,direntp->d_name);
: #else
10 anni fa hai scritto #ifdef _WIN32 ???
ma chi sei, il Mago Otelma? >;->


Sapevo che qualcuno l'avrebbe notato. 
Mi concederai che essendo una routine scritta per
il mondo UNIX il tutto torna. 
Direi che e' ovvio che e' stata aggiunta successivamente.
Grazie comunque per avermi dato del mago..
... ti ringrazio un po' meno per l'Otelma.
Fausto.


>manca il Sistema operativo!
Scusate, non sapevo...
Io lavoro sotto WinNT4, ma l'applicazione è console (linea di
comando), quindi non so... probabilmente la risposta è DOS.
Grazie a tutti, giulio


le MFC contengono la classe CFileFind, che può essere usata anche da
console
#include <afx.h>
void list_dir(CString& path, int depth = 0){
   CFileFind finder;
   BOOL bWorking = finder.FindFile(path);
   while (bWorking)
   {
      bWorking = finder.FindNextFile();
      if (finder.IsDirectory()){
         printf("%*s%s\\\n", depth, "", (LPCSTR) finder.GetFileName());
         list_dir(finder.GetFilePath(), depth + 4);
      } else
         printf("%*s%s\n", depth, "", (LPCSTR) finder.GetFileName());
   }
}
int main(){
    list_dir("C:\\");


Grazie anche a Fausto, ho trovato le funzioni chiave che cercavo:
opendir, readdir, rewinddir, closedir,
oltre a molte altre interessanti funzioni collaterali:
findfirst
findnext
getftime
setftime
chdir
getcurdir
getcwd
getdisk
mkdir
rmdir
setdisk
Bene, grazie ancora, ciao!


Erore impeddonabbile!!
ho dimenticato i controlli...
ecco il codice giusto
include <afx.h>
void list_dir(CString path, int depth = 0){
   CFileFind finder;
   if (path.ReverseFind('\\') < path.GetLength() - 1)
    path += "\\*.*";
   if (path.Find("*") == -1)
    path += "*.*";
   BOOL bWorking = finder.FindFile(path);
   while (bWorking)
   {
      bWorking = finder.FindNextFile();
      if (finder.IsDirectory()){
    if (strcmp(finder.GetFileName(),"..") == 0
     || strcmp(finder.GetFileName(),".")== 0)
     continue;


 C/C++? Che funzioni di libreria mi servono?
Dipende dal tuo sistema e dal tuo compilatore. Cerca funzioni tipo
findfirst()/findnext().
EMG

 C/C++? Che funzioni di libreria mi servono?
Non fai, in C o C++ portabile, cioe` che funzioni su tutte le
piattaforme.  I due linguaggi e le loro librerie standard non
coprono questa problematica.
Chiedi sul gruppo dedicato alla specifica piattaforma di tuo
interesse, ad esempio it.comp.programmare.win32.
Alex