Pergunta

Eu perguntei sobre encontrar em subdirs com critérios. Primeira resposta foi o uso FindFirstFileEx (). Parece que a função não é bom para esta finalidade ou eu estou usando-o errado.

Assim, alguém pode explicar como eu iria sobre busca em uma pasta, e tudo é subpastas para arquivos que correspondem (para dar alguns critérios amostrais) .doc; .txt; *. Wri; e são mais novos do que 2009-01-01?

Por favor, dar um exemplo de código específico para esses critérios, então eu sei como usá-lo.

Se não for possível, existe uma alternativa para fazer esta tarefa não-at-all-obscura ??? Estou me tornando bastante desconcertados que até agora não são bem conhecidos / ferramentas óbvias / maneiras de fazer isso.

Foi útil?

Solução

A partir MSDN :

Se você consultar o fragmento de código nessa 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);
   }
}

Você verá que você pode chamar FindFirstFileEx, onde argv 1 é um padrão string (LPCSTR) para procurar, e & FindFileData é uma estrutura de dados que contém informações dos dados encontrados arquivo .. hFind é o identificador que você usa em chamadas subsequentes com FindNextFile .. Eu acho que você também é possível adicionar mais parâmetros pesquisar usando o quarto e sexto parâmetro para FindFirstFileEx.

Boa sorte!

EDIT: BTW, eu acho que você pode verificar um arquivo ou atributos do dir usando GetFileAttributes () .. Basta passar o nome do arquivo encontrado em FileFindData .. (nome do arquivo pode referir-se ao nome de um arquivo ou um nome de diretório eu acho)

EDIT: MrVimes, aqui está o que você pode fazer (em pseudocódigo)

encontrar o primeiro arquivo (jogo com *)

  • Verifique os dados de encontrar o arquivo se ele é " '' .." (estes não são realmente diretórios ou arquivos)
    • Se cheque passado, dados de encontrar o arquivo de seleção se ele tem os atributos que você está procurando (ou seja, nome do arquivo de verificação, atributos de arquivo, tempo de criação, mesmo arquivo pode ser verificado nos dados de encontrar o arquivo , e que não) e fazer tudo o que com ele
      • Se cheque passado, fazer o que você precisa fazer com o arquivo
    • Se verificação falhou, ou FindNextFile chamada ou final, cabe a você

Algo assim ..

Outras dicas

Eu acho que você usar FindFirstFile para encontrar todas arquivos e ignorar aqueles cujos valores WIN32_FIND_DATA não correspondem aos seus critérios de pesquisa.

Bem, você poderia usá-lo para procurar * .doc, * .txt e * .wri por passar esses valores como o nome para procurar:

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

Para pesquisar por data é um pouco mais complicado, mas não excessivamente assim:

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

Você precisa fazer duas pesquisas. O primeiro é apenas para encontrar as subdirs, e você faz isso sem qualquer especificação do arquivo. A segunda pesquisa para os arquivos usa a especificação do arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top