使用具有特定搜索条件的FindFirstFIleEx()的示例

时间:2009-02-05 01:43:19

标签: c++ winapi filesystems search wildcard

我问过在标准中找到子目录。第一个答案是使用FindFirstFileEx()。看来这个功能对这个目的没有好处,或者我用错了。

所以有人可以解释我将如何在文件夹中搜索,以及所有文件的子文件夹匹配(以提供一些示例标准) .doc; .txt; * .wri;并且比2009-01-01更新?

请提供这些标准的具体代码示例,以便我知道如何使用它。

如果不可能,是否有替代方法可以做到这一点并非完全模糊的任务?我变得非常困惑,到目前为止还没有众所周知/明显的工具/方法可以做到这一点。

4 个答案:

答案 0 :(得分: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)模式,而&amp; FindFileData是包含找到的数据的文件信息的数据结构.hFind是你在FindNextFile的后续调用中使用的句柄。我认为你也可以通过使用FindFirstFileEx的第四和第六个参数来添加更多的搜索参数。

祝你好运!

编辑:BTW,我认为你可以使用GetFileAttributes()检查文件或目录的属性。只需传递FileFindData中找到的文件名..(文件名可以指我想的文件名或目录名)

编辑:MrVimes,这是你能做的(伪代码)

找到第一个文件(与*匹配)

  • 检查文件查找数据是否为“。”,“..”(这些不是真正的目录或文件)
    • 如果检查通过,检查文件查找数据是否具有您要查找的属性(即检查文件名,文件属性,甚至文件创建时间可以在文件查找数据中检查,以及不)并做任何事情
      • 如果检查通过,请执行您需要处理的文件
    • 如果检查失败,请调用findnextfile或end,由您决定

像这样......

答案 1 :(得分:0)

我认为您使用FindFirstFile查找所有文件,并忽略WIN32_FIND_DATA值与您的搜索条件不符的文件。

答案 2 :(得分:0)

您可以使用它来搜索* .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);
}
}

答案 3 :(得分:0)

您需要进行两次搜索。第一个是找到子目录,而你没有任何文件规范。第二次搜索文件使用文件规范。