View Full Version : [C] Elenco file di una directory W32
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
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:
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;
}
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
);
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
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:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.