Newsgroup: it.comp.programmare.win32
Titolo: elenco tutti i file di un disco

salve,
come da topic mi servirebbe sapere se è esite in c / c++ una qualche
funzione già pronta che ti da l'elenco di tutti i file presenti in un disco
non di una directory ma di tutto il disco un pò come se facessi
dir *.* /s ma senza i dettagli che mostra appunto il comando dir solo
l'elenco dei file
grazie in anticipo ciao :)

 l'elenco dei file
FindFirstFile & FindNextFile (cercale su 
msdn.microsoft.com
) e poi quando
trovi una directory la apri e la esplori (probabilmente lo farai
ricorsivamente)... Poi quando sarai più bravo probabilmente ti renderai
conto di quanto sia stupido farlo in maniera ricorsiva ed esplorerai le
directory linearmente.
--- bye

conosco quelle funzioni,
per linearmente che intendi ? quindi devo fare tutto  a manina nn esiste
niente di già pronto ?
poi avrei un'altro problemino
vorrei emulare la ricerca dei file con i caratteri jolly nel mio programma
solo che qua sono proprio in alto mare nn so da dove partire ... se mi metto
riesco a farlo sicuramente ma volevo sapere se esistono tecniche già pronte
per fare cose del genere
p.s
quello che devo fare è questo
un programmino che cataloghi tutti i file di un detterminato disco in un
archivio (un file o un database ) poi tramite interfaccia
mi permetta di eseguire delle ricerche su un detterminato file o più file
usando appunto i caratteri jolly
e mi restitutisca il risultato col disco con l'indentificativo del disco che
lo o li contiene
grazie ciao

 per fare cose del genere
Questo è un bordello bordelloso.... Due possibilità: o fai una doppia
esplorazione del disco (una volta solo per tirarti giù la struttura delle
directory, con un pattern del tipo *.* e la seconda, usando le directory di
prima ma usando il pattern che ti è stato dato)... Oppure fai una sola
lettura (la prima, *.*) e poi fai la comparazione del pattern a mano. Ho
guardato ma non ho visto nessuna API che confronta un nome di file con un
pattern... Magari ci sono... Ci sono migliaia di API in Windows...
--- bye



Domanda: cos'hanno di negativo le funzioni ricorsive, se usate
correttamente ?
Stefano "HappyMan" (Lake Maggiore - Italy)
-- 
The Personal Framework for Object Oriented Windows Development (Win32)
http://www.sgr.info
Email happyman69 (at) 
despammed.com

 correttamente ?
Sono di solito più lente rispetto a una loro linearizzazione :-)
Occupano memoria dello stack (che di solito è molto ma molto più limitata di
quella sull'heap... Se sei in un thread il tuo stack potrebbe essere molto
piccolino. Se crei una funzione "generica" devi considerare anche queste
cose)... Ed inoltre è più difficile gestire un errore di esaurimento stack
rispetto a un "malloc ritorna NULL" o a un "new fa un throw".
--- bye

 ha scritto nel messaggio
news:WCY4c.43729$z23.2...@news3.tin.it...


 quindi pensavo di implementare io un motore anche se ridotto ...
Magari trovi qualcosa su codeproject o su codeguru... O in ogni caso su
google troverai di sicuro qualche dispensa universitaria di "pattern
matching" (credo che sia questo il termine esatto). Cmq a te serve un
pattern matching molto semplificato (solo * e ?).
Sono ancora indeciso se ti conviene fare una singola passata o due.... Sono
molto combattuto.
Ti spiego il perchè: mettiamo il caso che un domani la MS nella sua infinita
saggezza mettesse le regexp nella ricerca dei files (tipo con possibilità di
dire [A-Da-d]... Se tu usi il metodo a doppia passata il tuo programma è
compatibile con il possibile futuro (l'API viene di sicuro upgradata). Se
invece ti realizzi in casa il patter-matcher allora no. Mah! Scelte che devi
fare tu!
--- bye

Certo che c'è... Ti danno anche il maggiordomo incluso! :-)
A manina si fa! Se no passa al VB!
Le directory le puoi attraversare in due maniere: o quando il FindNext ti dà
un file e tu vedi che è una directory richiami ricorsivamente la tua
funzione e ti fai esplorare la directory oppure ti tieni in memoria da
qualche parte un elenco di directory ancora da esplorare e, quando hai
finito con la directory corrente esplori la prima di quelle directory.
Chiaramente se al suo interno trovi altre sottodirectory aggiungi anche
quelle all'elenco di prima. In questa maniera l'esplorazione è lineare
(opposta al metodo ricorsivo)
--
scusa non ho capito bene questo passaggio (quello lineare) alla fine come
fai ad esplorare le directory...

 fai ad esplorare le directory...
Ti faccio un esempio: il tuo disco è così:
pippo <dir>
pippo\pippo-1 <file>
pippo\peppo <dir>
pippo\pippo-2 <file>
pippo\pippo-3 <file>
root1 <file>
pluto <dir>
root2 <file>
Ora: tu attraversi la root che contiene pippo, root1, pluto e root2.
Incontri due directory: pippo e pluto. Inserisci il loro nome in una lista.
In ogni caso esplori tutta la root. Poi guardi la lista. C'è qualcosa? Sì.
(c:\pippo, c:\pluto) Esplori pippo. Ci trovi pippo-1, peppo, pippo2, pippo3.
Quando trovi peppo, visto che è una directory, lo metti nella stessa lista
di prima (che in questo momento quindi contiene: (c:\pluto, c:\pippo\peppo).
Finisci di esplorare pippo. Guardi la lista... C'è qualcosa? Sì: (c:\pluto,
c:\pippo\peppo). Esplori pluto... E così via. se usi il c++ puoi usare una
list<string>, se usi le mfc una CStringList, con ATL una CAtlList<CString>.
O se no, se conosci un minimo di C, ti avranno di sicuro insegnato a fare le
liste concatenate.
--- bye

 ha scritto nel messaggio
news:k265c.55715$O31.2...@news4.tin.it...


 quindi che mi dici ?
Che chiaramente ci pensava il SO :-)
E che quindi adesso è rimappata al Windows.
--- bye

ok a questo punto dovrei farti altre due domande ;)
1) pensi sia possible riusare quel codice ? alla fine un math di strighe da
qualche parte deve essere pur fatto
2)come recupero la nuova "posizione" dell'interrupt in win ? e come lo
chiamo ?
grazie ancora :-)

 chiamo ?
1) No
2) Con le funzioni che ti ho detto!
--- bye

Eccola:
void __fastcall TFormFtp::TrovaFile(char path[MAX_STR])
{
  char path1[MAX_STR];
  char path2[MAX_STR];
  HANDLE hSearch;
  BOOL fFinished = FALSE;
  chdir(path);
  hSearch = FindFirstFile("*.*", &File_Find_Data);
  while ((!fFinished) && (!Finisci) )
  {
    if ((File_Find_Data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
(File_Find_Data.cFileName[0] != '.'))
    {
      if( CheckBoxSottocartelle->Checked == true )
      {
        if (path[StrLen(path)-1] != '\\')
          sprintf(path1,"%s\\%s",path,File_Find_Data.cFileName);
        else
          sprintf(path1,"%s%s",path,File_Find_Data.cFileName);
        Application->ProcessMessages();       // per aggiornare i campi sul
video
        TrovaFile(path1);
      }
    }
    else
    {
      chdir(path);
      Application->ProcessMessages();       // per aggiornare i campi sul
video
      sprintf( path1, "%s\\%s", path, File_Find_Data.cFileName );
      sprintf( Info_File.Nome, "%s", File_Find_Data.cFileName );
      sprintf( Info_File.Cartella, "%s", path );
      if( GetFileInfo() == true )    // Rileva le informazioni dal file
      {
      }
    }
    if (!FindNextFile(hSearch, &File_Find_Data))
      if (GetLastError() == ERROR_NO_MORE_FILES)
          fFinished = TRUE;
  }
}
Ciao
Voto:

scusami nuovamente ma non riesco a capire di quali funzioni stai parlando
:-)

> scusami nuovamente ma non riesco a capire di quali funzioni stai parlando
Non hai quotato ed hai riposto a te stesso. Mi spieghi come possiamo
aiutarti? Molti di noi non sono telepati, ed altri cercano di non leggere i
pensieri altrui se non autorizzati.
--- bye

2) Con le funzioni che ti ho detto!
no ho quotato e che outlook fa i dispetti :P mi riferivo alla risposta alla
domanda due.

 domanda due.
FindFirstFile, FindNextFile. (cercale sull'MSDN)
--- bye