主要有两个,FindFirstFile 与 PathMatchSpec,前者用于搜索文件系统,后者用于检查路径字符串是否与表达式相匹。

https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd
https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfilea

    WIN32_FIND_DATA finddata;
    HANDLE hFind = ::FindFirstFile(path, &finddata);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        BOOL findSucessful = true;
        while(findSucessful)
        {
            foundfullpath = folderpath+finddata.cFileName;
            if (!PathMatch(Exludes, foundfullpath, finddata.cFileName) && filesRecord.find(foundfullpath)==filesRecord.end())
            {
                if (finddata.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) 
                {
                //是目录,应当开启递归搜索...
                }
                else if (...可以进一步调用PathMatchSpec)
                {
                }
            }
            findSucessful = ::FindNextFile(hFind, &finddata);
        }
        ::FindClose(hFind);
    }

PathMatchSpec(L"C:\\tmp\\123", L"C:\\*");  // 返回 true

注意 FindFirstFile 传入的路径,中间部分不能有通配符,只允许末尾出现:

FindFirstFile(L"C:\\tmp\\*.*", &finddata); // 搜索文件夹内所有文件与目录

而 PathMatchSpec 的通配符可以出现在中间甚至最开始:

PathMatchSpec(L"C:\\tmp\\123", L"*\\123"); // 匹配

星号匹配任意长度,问号匹配一个。文档中有更多注意事项。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐