Problemi con WIN32_FIND_DATA

di il
2 risposte

Problemi con WIN32_FIND_DATA

Salve,
Sto scrivendo un programma in C per controllare quante sottodirectory sono contenute in una fissata directory di partenza. Uso “FindFirstFile” e “FindNextFile” per scorrerla tutta e confronto di volta in volta il contenuto di “dwFileAttributes” della struttura “WIN32_FIND_DATA” con “FILE_ATTRIBUTE_DIRECTORY”.
Quando i due valori sono uguali ho incontrato una directory.
Ora il programma non sempre funziona allo stesso modo passando da un disco/volume all’altro.
Il contenuto di “dwFileAttributes” alcune volte, incontrando una directory, restituisce il valore decimale di 16 che corrisponde al valore “FILE_ATTRIBUTE_DIRECTORY” altre volte restituisce il valore decimale 8208.
Avevo pensato che cio’ fosse dovuto al file system usato perche’ le volte che restituiva 8208 scandivo sempre un volume formattato NTFS, fino che non ho utilizzato un disco esterno formattato con NTFS che ha funzionato correttamente restituendomi 16.
Non so da cosa possa dipendere, c’e’ qualcuno che puo' darmi una risposta ?
In allagato il codice semplificato che utilizzo la directory di partenza e' C:\aaa.

#include <stdio.h>
#include <windows.h>

int main()
{
char *dir="C:\\aaa";//directory da scandire
WIN32_FIND_DATA FindFileData;
HANDLE hDir = FindFirstFile (dir, &FindFileData);
printf("\nFILE_ATTRIBUTE_DIRECTORY=%d\n",FILE_ATTRIBUTE_DIRECTORY);//stampo valore per directory

do
{
if(hDir == INVALID_HANDLE_VALUE)
{
printf("Errore Directory inesistente. \n"); //controllo se esiste
}
printf("\n%s ha restituito %d\n",FindFileData.cFileName,FindFileData.dwFileAttributes);//stampo nome file e suo valore di ritorno
}
while (FindNextFile(hDir,&FindFileData ));
}

Saluti
e tks

2 Risposte

  • Re: Problemi con WIN32_FIND_DATA

    Ciao,

    La soluzione è piuttosto semplice, FILE_ATTRIBUTE_DIRECTORY è un flag, non un valore... come tale può essere impostato nella dwFileAttributes assieme ad altri flags, che rendono il valore numerico diverso da 0x10... 8208 è, in esa, 0x2010... e come vedi il 0x10 è impostato...
    Altri esempi di numerici in cui è impostato il flag: 0x11, 0x110, 0x212, 0xabcdef1a, 0x33, 0x70, 0xabcdef7a.

    Per testare se un flag è attivo o meno dovrai usare gli operatori booleani & e | invece che controllare con ==... in particolare nel tuo caso:
    if( dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) //implicito !=0
    {
    ... flag impostato, l'entry è una directory
    }else{
    ...flag non impostato, l'entry è un file (o, meglio, non è una directory)
    }
    PS:Probabilmente la sezione più indicata per queste domande è C++ piuttosto che questa qui...

    Ciaociao
  • Re: Problemi con WIN32_FIND_DATA

    Ok ho capito,
    FILE_ATTRIBUTE_DIRECTORY non essendo un valore ma un flag impostato in winnt.h a “#define FILE_ATTRIBUTE_DIRECTORY 0x00000010”.
    Tale impostazione corrisponde in binario a 10000. Per cui facendo l’AND bit a bit con i flag (0x10, 0x2010, 0x212 etc). il cui quinto bit da destra è uguale ad 1 risulta sempre vera.
    Sai, sono un autodidatta appassionato di questa disciplina che purtroppo ai miei tempi (48 nel nickname sta per l’anno di nascita) non si studiava, ora al limite della pensione mi diletto a scoprire questa materia.
    Ti ringrazio per la nuova delucidazione e terrò conto, per un eventuale altra domanda di inserirla nella sezione giusta.
    ByBy
Devi accedere o registrarti per scrivere nel forum
2 risposte