【问题标题】:Example of using FindFirstFIleEx() with specific search criteria将 FindFirstFIleEx() 与特定搜索条件一起使用的示例
【发布时间】:2009-02-05 01:43:18
【问题描述】:

我询问了如何在具有标准的子目录中查找。第一个答案是使用 FindFirstFileEx()。看来这个功能不适合这个目的,或者我用错了。

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

请给出这些条件的具体代码示例,以便我知道如何使用它。

如果不可能,是否有替代方法来完成这项不那么晦涩的任务???到目前为止,还没有众所周知/明显的工具/方法可以做到这一点,这让我感到非常困惑。

【问题讨论】:

    标签: c++ winapi filesystems search wildcard


    【解决方案1】:

    来自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,其中 argv1 是要查找的字符串 (LPCSTR) 模式,而 &FindFileData 是包含找到数据的文件信息的数据结构。hFind 是您的句柄使用 FindNextFile 进行后续调用。我认为您还可以通过使用 FindFirstFileEx 的第四个和第六个参数来添加更多搜索参数。

    祝你好运!

    编辑:顺便说一句,我认为您可以使用 GetFileAttributes() 来检查文件或目录的属性。只需传递在 FileFindData 中找到的文件名 ..(文件名可以指文件名或我认为的目录名)

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

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

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

    类似的东西..

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,这几乎就是我对 findfirst 函数所做的事情。所以我想我不会通过使用不同的功能来实现任何目标。我希望有一些旨在为我进行过滤的东西(因此会更有效率)。我想我会坚持下去。无论如何谢谢:)
      • 我不认为这是正确的.. FindFirstFile 在找到第一个符合我认为的标准的文件时返回..
      • 这有点难以解释。如果我在第一个参数中指定条件(例如“c:\asampledir*.doc”),那么它不会找到目录,因此它不会允许周围的代码在子目录中搜索,因为周围的代码会等待文件成为一个目录,然后递归运行
      • 这是不正确的,如果您有一个目录名称“c:​​\asampledir\sampledocdir.doc\somefile.doc”,并且您搜索“c:\asampledir*.doc”,它将匹配目录。
      • 由于 FindFirst* 变体一次只匹配一个文件名掩码,您可以使用 PathMatchSpecEx(findData.cFileName, L".doc;.txt;*.wri" , PMSF_MULTIPLE) 以知道要忽略哪些。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您需要进行两次搜索。第一个只是查找子目录,您无需任何文件规范即可执行此操作。对文件的第二次搜索使用文件规范。

        【讨论】:

          猜你喜欢
          • 2017-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多