【问题标题】:Find file with wildcards on entire disk在整个磁盘上查找带有通配符的文件
【发布时间】:2016-04-11 08:02:34
【问题描述】:

我需要在磁盘 (c:) 上使用通配符 (*.txt*.jpeg*.doc) 查找可变扩展文件。

我尝试了以下函数,但无法使其递归,并且无法正常工作:

void Recurse(LPCTSTR str)
{
    WIN32_FIND_DATA file;
    cout << "Value INPUT:" << str <<"\n";
    HANDLE search_handle=FindFirstFile(str,&file);
    if (search_handle) {
        do {
        if(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
                strcmp(file.cFileName,"..")!=0
                && strcmp(file.cFileName,".")!=0
                && strcmp(file.cFileName,"$Recycle.Bin")!=0
                && strcmp(file.cFileName,"Recovery")!=0
                && strcmp(file.cFileName,"System Volume Information")!=0
                && strcmp(file.cFileName,"PerfLogs")!=0
                && strcmp(file.cFileName,"Windows")!=0)
            {
                str = file.cFileName;
                cout << "Directory :" << file.cFileName <<"\n";
                Recurse(str); // Function to remind new directory
            } else {
                if (file.cFileName == "*.txt") {
                    std::wcout << file.cFileName << std::endl; //Print files find with estension txt
                }
            }
        } while(FindNextFile(search_handle,&file));

        CloseHandle(search_handle);
    }
}

当然,我用静态值 (*.txt) 尝试了它是否有效,但是当我从 main 中调用它时它不起作用:

Recurse("C:\\*");

【问题讨论】:

  • file.cFileName == "*.txt":这里,== 不是通配符模式匹配运算符,它比较两个指针是否相等(它们不相等)。
  • 好的,谢谢,但我的另一个问题是我不知道如何通过名称目录进行递归研究。
  • 你看到"Directory :" 被打印了吗?我会在二元运算符周围加上括号,因为它们以奇怪的优先级进行评估(即if( (file.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY) &amp;&amp;)......不确定这是否是问题......

标签: c++


【解决方案1】:
I modified the code in this way. If it finds them throwing me * .txt files and me brings them correctly, but the path instead in many files shows me incorrect with several strange characters. I can not understand why such behavior.  

 char *my1;
    char *my2;
    char *my3;
    char *my4;
    char *cp2;
    LPCTSTR ori;
    std::string stringa_mia;
    std::vector<std::string> listafiles;
    std::vector<std::string> listapath;

    void Recurse(LPCTSTR str, LPCTSTR ori)
    {
        WIN32_FIND_DATA file;
        cp2 = strdup(str);
        strcat(cp2, "\\*");
        HANDLE search_handle=FindFirstFile(cp2,&file);
        BOOL res = TRUE;
        if (search_handle)
        {
            while(search_handle != INVALID_HANDLE_VALUE && res)
            {
            if(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
                        strcmp(file.cFileName,"..")!=0
                        && strcmp(file.cFileName,".")!=0
                        && strcmp(file.cFileName,"$Recycle.Bin")!=0
                        && strcmp(file.cFileName,"Recovery")!=0
                        && strcmp(file.cFileName,"System Volume Information")!=0
                        && strcmp(file.cFileName,"PerfLogs")!=0
                        && strcmp(file.cFileName,"Windows")!=0
                        && strcmp(file.cFileName,"Program Files")!=0
                        && strcmp(file.cFileName,"Boot")!=0
                        && strcmp(file.cFileName,"Program Files (x86)")!=0
                        && strcmp(file.cFileName,"AppData")!=0
                        && strcmp(file.cFileName,"ProgramData")!=0
                        && strcmp(file.cFileName,"Cookies")!=0
                        && strcmp(file.cFileName,".android")!=0
                        && strcmp(file.cFileName,"Programmi")!=0
                        )
                    {
                        my3 = strdup(file.cFileName);
                        my2 = strdup(str);
                        my1 = strdup(ori);
                        strcat(my2, "\\");
                        strcat(my2, my3);
                        CloseHandle(search_handle);
                        Recurse(my2,ori);
                        }
            else
            {
                my4 = strdup(file.cFileName);
                stringa_mia = std::string(my4);
                if (stringa_mia.find(".txt")!=std::string::npos) {
                  listafiles.push_back(stringa_mia);
                  listapath.push_back(str);
                                                }
             }
            res = FindNextFile(search_handle,&file);
            }
                CloseHandle(search_handle);

        }
    }

我在这种模式下调用函数:

递归("C:","C:");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多