Pregunta

Le pregunté sobre la búsqueda en subdirectorios con el criterios. Primera respuesta fue el uso FindFirstFileEx (). Parece que la función no es bueno para este propósito o estoy usando mal.

Entonces, ¿puede alguien explicar cómo iba a ir sobre la búsqueda de una carpeta, y todas sus subcarpetas para los archivos que coinciden (por poner algunos criterios de ejemplo) .doc; .txt; *. WRI; y son más recientes que 2009-01-01?

Por favor, dar un ejemplo de código específico para esos criterios, así que sé cómo usarlo.

Si no es posible, no es una alternativa para hacer esta tarea no-a-toda-oscura ??? Estoy llegando a ser absolutamente desconcertado que hasta el momento no se conocen bien / herramientas / obvias maneras de hacer esto.

¿Fue útil?

Solución

MSDN :

Si se hace referencia al fragmento de código en la página:

#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);
   }
}

Vas a ver que se puede llamar FindFirstFileEx, donde argv 1 es una cadena (LPCSTR) patrón a buscar, y FindFileData y es una estructura de datos que contiene información de archivo de los datos que se encuentran .. HBusque es el mango se utiliza en llamadas posteriores con FindNextFile .. Creo que se también puede añadir más parámetros de búsqueda mediante el parámetro cuarto y sexto a FindFirstFileEx.

Buena suerte!

Edit: Por cierto, creo que se puede comprobar un archivo o los atributos de dir mediante el uso de noreferrer GetFileAttributes () .. Sólo tiene que pasar el nombre de archivo encontrado en FileFindData .. (nombre del archivo puede referirse al nombre de un archivo o un nombre de directorio creo)

EDIT: MrVimes, esto es lo que podría hacer (en pseudocódigo)

encontrar el primer archivo (coincidencia con *)

  • Compruebe el archivo de datos se encontró si es " '' .." (estos no son realmente los directorios o archivos)
    • Si cheque pasa, comprobador de archivo encontrar datos si tiene los atributos que usted está buscando (es decir, el nombre de archivo de verificación, atributos de archivo, incluso presentar el tiempo de creación se puede comprobar en el archivo encontrar datos , y lo no) y hacer lo que sea con él
      • Si cheque pasa, hacer lo que tiene que ver con el archivo
    • si no cheque, o bien llamar FindNextFile o al final, depende de ti

Algo por el estilo ..

Otros consejos

Creo que se utiliza para encontrar FindFirstFile todos archivos e ignorar aquellos cuyos WIN32_FIND_DATA valores no coinciden con su criterio de búsqueda.

Bien se podría utilizar para buscar * .doc, * .txt y * .wri pasando esos valores como el nombre de la búsqueda para:

FindFirstFileEx("*.doc", FindExInfoStandard, &fileData, FindExSearchNameMatch, NULL, 0);

Para buscar por la fecha es un poco más complicado, pero no demasiado:

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);
}
}

Es necesario hacer dos búsquedas. La primera es simplemente encontrar los subdirectorios, y hacerlo sin ninguna especificación de archivo. La segunda búsqueda de los archivos utiliza la especificación de archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top