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.

È stato utile?

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top