2009-02-05 9 views
0

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

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

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

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

ответ

3

От 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.

Удачи вам!

EDIT: Кстати, я думаю, вы можете проверить файл или атрибуты Dir путем использования GetFileAttributes() .. Просто передайте имя файла найденную в FileFindData .. (имя файла может относиться к имени файла или имя каталога, я думаю)

EDIT: MrVimes, вот что вы могли бы сделать (в псевдокоде)

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

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

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

0

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

+0

Право, это в значительной степени то, что я уже делаю с функцией findfirst. Поэтому я думаю, что ничего не добьюсь, используя другую функцию. Я надеялся на то, что было разработано для фильтрации для меня (поэтому было бы более эффективно). Наверное, я буду придерживаться. спасибо в любом случае :) – MrVimes

+0

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

+0

это немного сложно объяснить. если я укажу критерии в первом параметре (например, «c: \ asampledir \ *. doc»), то он не найдет каталоги, поэтому он не позволит окружающему коду искать в подкаталогах, так как окружающий код ждет файл должен быть рекурсивно, а затем работает рекурсивно – MrVimes

0

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

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

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