Пример использования FindFirstFIleEx () с конкретными критериями поиска - PullRequest
0 голосов
/ 05 февраля 2009

Я спрашивал о поиске в подкаталогах с критериями. Первым ответом было использование FindFirstFileEx (). Кажется, функция не подходит для этой цели, или я использую ее неправильно.

Так может кто-нибудь объяснить, как я буду выполнять поиск в папке и во всех ее подпапках для файлов, которые соответствуют (чтобы дать некоторые примеры критериев) .doc; .txt; *. Wri; и новее 2009-01-01?

Пожалуйста, дайте конкретный пример кода для этих критериев, чтобы я знал, как его использовать.

Если это невозможно, есть ли альтернатива для выполнения этой не совсем непонятной задачи ??? Я становлюсь совершенно сбитым с толку, что пока нет хорошо известных / очевидных инструментов / способов сделать это.

Ответы [ 4 ]

3 голосов
/ 05 февраля 2009

С MSDN :

Если вы ссылаетесь на фрагмент кода на этой странице:

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

Вы увидите, что вы можете вызвать FindFirstFileEx, где argv 1 - это шаблон строки (LPCSTR) для поиска, а & FindFileData - структура данных, которая содержит информацию о файле найденных данных. HFind это дескриптор, который вы используете при последующих вызовах с FindNextFile .. Я думаю, вы также можете добавить дополнительные параметры поиска, используя четвертый и шестой параметр для FindFirstFileEx.

Удачи!

РЕДАКТИРОВАТЬ: Кстати, я думаю, что вы можете проверить атрибуты файла или каталога с помощью GetFileAttributes () .. Просто передайте имя файла, найденное в FileFindData .. (имя файла может относиться к имени файла или каталогу имя мне кажется)

РЕДАКТИРОВАТЬ: MrVimes, вот что вы могли бы сделать (в псевдокоде)

найти первый файл (соответствует *)

  • Проверьте данные поиска файла, если это ".", ".." (на самом деле это не каталоги или файлы)
    • если проверка пройдена, проверьте данные поиска файла, если у них есть атрибуты, которые вы ищете (то есть проверьте имя файла, атрибуты файла, , даже время создания файла можно проверить в данных поиска файла , а что нет ) и делай с этим что угодно
      • если проверка пройдена, делайте все что нужно с файлом
    • если проверка не удалась, либо вызовите findnextfile или end, до вас

Нечто подобное ..

0 голосов
/ 05 февраля 2009

Вам нужно сделать два поиска. Первый - просто найти подкаталоги, и вы делаете это без какой-либо спецификации файла. Второй поиск файлов использует спецификацию файла.

0 голосов
/ 05 февраля 2009

Ну, вы можете использовать его для поиска * .doc, * .txt и * .wri, передав эти значения в качестве имени для поиска:

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

Поиск по дате немного сложнее, но не слишком:

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);
}
}
0 голосов
/ 05 февраля 2009

Я думаю, что вы используете FindFirstFile для поиска всех файлов и игнорируете те, чьи значения WIN32_FIND_DATA не соответствуют вашим критериям поиска.

...