2011-11-09 7 views
11

Utilizzo le chiamate API di Windows FindFirstFile e FindNextFile per cercare file corrispondenti a una determinata stringa di caratteri jolly in una directory. Ad esempio, potrei voler trovare tutti i file XML in una directory, quindi cerco il pattern "* .xml".Esiste un'alternativa all'API FindFirstFile/FindNextFile di Windows che non esegue la ricerca di nomi di file brevi?

Sto riscontrando il problema che se sto cercando un'estensione di 3 lettere e l'estensione di un file inizia con quell'estensione di 3 lettere, verrà ripresa dalla mia ricerca, anche se l'estensione contiene più caratteri dopo i primi 3. Ad esempio, se il mio file è denominato somelongname.xmlaaaa, questo verrà preso dalla ricerca di "* .xml". Il nome breve di quel file è somelo ~ 1.xml, che corrisponde alla mia stringa jolly.

Potrei fare il mio jolly per risolvere questo problema, ma presumibilmente un'API di Windows sarebbe in grado di farlo in modo più efficiente di quanto avrei potuto, e il mio codice sarebbe stato più semplice. Per quanto posso dire, non c'è un modo per forzare queste funzioni a ignorare i nomi brevi. C'è qualche API Windows espone con questa funzionalità?

risposta

3

Purtroppo , la documentazione trovata da JoeFish nella sua risposta risulta essere un po 'fuorviante. La ricerca troverà comunque i file che corrispondono al nome breve, anche se si passa in FindExInfoBasic. Semplicemente non includerà il nome del file breve nel membro cAlternateFileName della struttura WIN32_FIND_DATA.

Tuttavia, ho trovato che esiste una funzione di Windows PathMatchSpec che eseguirà lo stesso confronto con caratteri jolly rispetto a una stringa fornita. Quindi, sono stato in grado di aggiungere un secondo passaggio alla mia ricerca che verifica che il nome lungo corrisponda al modello. È persino disponibile in Windows XP.

11

Partenza FindFirstFileEx - ha un parametro di fInfoLevelId che prende un'enumerazione FINDEX_INFO_LEVELS:

typedef enum _FINDEX_INFO_LEVELS { 
    FindExInfoStandard, 
    FindExInfoBasic, 
    FindExInfoMaxInfoLevel 
} FINDEX_INFO_LEVELS; 

FindExInfoBasic

La funzione FindFirstFileEx non interroga il nome di file breve, migliorare la velocità complessiva enumerazione. I dati vengono restituiti in una struttura WIN32_FIND_DATA e il membro cAlternateFileName è sempre una stringa NULL.

Tuttavia:

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: questo valore non è supportata fino a Windows Server 2008 R2 e Windows 7.

+0

Interessante. Devo supportare Windows XP, quindi probabilmente non posso fare affidamento su questa funzionalità. Sfortunatamente, il fatto che questo sia stato aggiunto a questa API in Windows 7 probabilmente indica che non esiste in nessun'altra API prima di allora. –

+0

Sembra che sia così. Mi spiace di averti fallito :) E grazie per la modifica, @Rob – JoeFish

+0

Si scopre che questa documentazione è molto fuorviante. La ricerca troverà comunque i file che corrispondono al nome breve, anche se si passa in FindExInfoBasic. Semplicemente non includerà il nome del file breve nel membro cAlternateFileName della struttura WIN32_FIND_DATA. –

Problemi correlati