PDA

View Full Version : [C] Elenco file di una directory W32


kmox
13-01-2005, 20:07
CIAO

Come faccio ad ottenere l'elenco dei soli file o delle sole sottocartelle di una determinata directory?

Uso C sotto Windows.
:cry:

VegetaSSJ5
13-01-2005, 20:34
devi usare le api di windows, guarda qui:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/directory_management_functions.asp

kmox
13-01-2005, 21:24
Ok anch'io avevo visto quello solo che non riesco ad utilizzarlo, così dovrebbe essere giusto ma non mi conta solo le directory ma anche i file!




//Restituisce il numero di sottocartelle di una cartella data
//va richiamato ContaCartelle("C:\\Percorso\\*")
int ContaCartelle( char* percorsoRadice )
{
int risultato = 0;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;

hFind = FindFirstFile( percorsoRadice, &FindFileData );

//Se il file è valido cerco al suo interno le cartelle
if (hFind != INVALID_HANDLE_VALUE)
{
//Finché esistono ancora files
while (FindNextFile(hFind, &FindFileData) != 0)
{
//Se il file è una directory incremento il contatore
if ( GetFileAttributes( FindFileData.cFileName ) & FILE_ATTRIBUTE_DIRECTORY )
{
risultato++;
}
}

//Tolgo le due cartelle . e ..
//-1 perche il primo file non l'avevo conteggiato
risultato--;

FindClose(hFind);

}

return risultato;
}



:confused:

kmox
13-01-2005, 21:25
Per utilizzarlo va inclusa windows.h

VegetaSSJ5
13-01-2005, 21:50
scusa ma non dovresti usare il dwFileAttributes al posto di cFileName??//Restituisce il numero di sottocartelle di una cartella data
//va richiamato ContaCartelle("C:\\Percorso\\*")
int ContaCartelle( char* percorsoRadice )
{
int risultato = 0;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;

hFind = FindFirstFile( percorsoRadice, &FindFileData );

//Se il file è valido cerco al suo interno le cartelle
if (hFind != INVALID_HANDLE_VALUE)
{
//Finché esistono ancora files
while (FindNextFile(hFind, &FindFileData) != 0)
{
//Se il file è una directory incremento il contatore
if ( GetFileAttributes( FindFileData.dwFileAttributes ) & FILE_ATTRIBUTE_DIRECTORY )
{
risultato++;
}
}

//Tolgo le due cartelle . e ..
//-1 perche il primo file non l'avevo conteggiato
risultato--;

FindClose(hFind);

}

return risultato;
}

kmox
13-01-2005, 21:57
Originariamente inviato da VegetaSSJ5
scusa ma non dovresti usare il dwFileAttributes al posto di cFileName??//Restituisce il numero di sottocartelle di una cartella data
//va richiamato ContaCartelle("C:\\Percorso\\*")
int ContaCartelle( char* percorsoRadice )
{
int risultato = 0;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;

hFind = FindFirstFile( percorsoRadice, &FindFileData );

//Se il file è valido cerco al suo interno le cartelle
if (hFind != INVALID_HANDLE_VALUE)
{
//Finché esistono ancora files
while (FindNextFile(hFind, &FindFileData) != 0)
{
//Se il file è una directory incremento il contatore
if ( GetFileAttributes( FindFileData.dwFileAttributes ) & FILE_ATTRIBUTE_DIRECTORY )
{
risultato++;
}
}

//Tolgo le due cartelle . e ..
//-1 perche il primo file non l'avevo conteggiato
risultato--;

FindClose(hFind);

}

return risultato;
}

E' il GetFileAttributes che me lo restituisce un dwFileAttributes .

Da msdn:

DWORD GetFileAttributes(
LPCTSTR lpFileName
);

kmox
13-01-2005, 22:01
Come dovrebbe essere utilizzata altrimenti?
:huh:

VegetaSSJ5
13-01-2005, 22:37
prova a guardare quest'esempio, forse può esserti utile...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/retrieving_and_changing_file_attributes.asp

kmox
13-01-2005, 23:22
Diciamo che fondamentalmente mi sono basato su quell'esempio per fare la mia funzione di fatti



...

dwAttrs = GetFileAttributes(FileData.cFileName);
if( GetLastError() != 0 ) return;

if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
...
}
...



usa nello stesso modo in cui ho usato io. Boh!
:muro: