Esempio di utilizzo FindFirstFileEx () con specifici criteri di ricerca
-
21-08-2019 - |
Domanda
ho chiesto di trovare in sottocartelle con criteri. Prima risposta era uso FindFirstFileEx (). Sembra che la funzione non è buono per questo scopo o sto usando sbagliato.
Così qualcuno può spiegare come vorrei andare sulla ricerca in una cartella, e tutte le sue sottocartelle per i file che corrispondono (per dare alcuni criteri di esempio) .doc; .txt; *. WRI; e sono più recenti di 2009-01-01?
Si prega di dare un esempio di codice specifico per tali criteri quindi so come usarlo.
Se non è possibile, c'è un'alternativa per fare questo compito non-a-tutti-oscura ??? Sto diventando abbastanza perplessi che finora non ci sono ben noti / strumenti / ovvi modi per farlo.
Soluzione
MSDN :
Se si fa riferimento al frammento di codice in quella pagina:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
void _tmain(int argc, TCHAR *argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
if( argc != 2 )
{
_tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
return;
}
_tprintf (TEXT("Target file is %s\n"), argv[1]);
hFind = FindFirstFileEx(argv[1], FindExInfoStandard, &FindFileData,
FindExSearchNameMatch, NULL, 0);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFileEx failed (%d)\n", GetLastError());
return;
}
else
{
_tprintf (TEXT("The first file found is %s\n"),
FindFileData.cFileName);
FindClose(hFind);
}
}
Vedrai che si può chiamare FindFirstFileEx, dove argv 1 è una stringa (LPCSTR) modello a cercare, e & FindFileData è una struttura dati che contiene informazioni di file dei dati trovati .. HTrovare è la maniglia si utilizza nelle successive chiamate con FindNextFile .. penso che tu può anche aggiungere più parametri di ricerca utilizzando il quarto e il sesto parametro FindFirstFileEx.
In bocca al lupo!
EDIT: A proposito, penso che si può controllare un file o gli attributi di dir utilizzando noreferrer GetFileAttributes () .. Basta passare il nome del file trovato nel FileFindData .. (nome del file può fare riferimento al nome di un file o di un nome di directory credo)
EDIT: MrVimes, ecco cosa si potrebbe fare (in pseudocodice)
trova il primo file (match con *)
- Controllare il file di trovare i dati se è " '' .." (queste non sono realmente directory o file)
- se la verifica passato, controllare file di trovare i dati se ha gli attributi che stai cercando (vale a dire il nome del file di controllo, attributi di file, anche il file ora di creazione può essere controllato nel file di trovare i dati , e che cosa no) e fare tutto ciò con esso
- se la verifica passato, fare tutto ciò che è necessario fare con il file
- se la verifica non è riuscita, o chiamare FindNextFile o alla fine, spetta a voi
- se la verifica passato, controllare file di trovare i dati se ha gli attributi che stai cercando (vale a dire il nome del file di controllo, attributi di file, anche il file ora di creazione può essere controllato nel file di trovare i dati , e che cosa no) e fare tutto ciò con esso
Una cosa del genere ..
Altri suggerimenti
Credo che si utilizza FindFirstFile
trovare tutti i file e ignorare quelli i cui WIN32_FIND_DATA
valori non corrispondenti alla vostra ricerca.
Beh si potrebbe utilizzare per la ricerca di * .doc, * .txt e * .wri passando quei valori come il nome da cercare:
FindFirstFileEx("*.doc", FindExInfoStandard, &fileData, FindExSearchNameMatch, NULL, 0);
Per una ricerca per data è un po 'più complicato, ma non troppo:
SYSTEMTIME createTime;
SYSTEMTIME searchDate;
FILETIME compareTime;
HANDLE searchHandle;
searchDate.wYear = 2009;
searchDate.wMonth= 1;
searchDate.wDay = 1;
SystemTimeToFileTime(searchDate, &compareTime);
searchHandle FindFirstFileEx("*", FindExInfoStandard, &fileData, FindExSearchNameMatch, NULL, 0);
if(searchHandle != INVALID_HANDLE_VALUE)
{
While(searchHandle != ERROR_NO_MORE_FILES)
{
FileTimeToSystemTime(fileData.ftCreationTime, &createTime);
if((ULARGE_INTEGER)compareTime < (ULARGE_INTEGER)createTime)
printf("%s matches date criteria", fileData.cFileName);
FindNextFile(searchHandle, &fileData);
}
}
Hai bisogno di fare due ricerche. La prima è solo per trovare le sottodirectory, e lo si fa senza alcuna specifica file. La seconda ricerca per i file utilizza il file spec.