简体   繁体   English

在整个磁盘上查找带有通配符的文件

[英]Find file with wildcards on entire disk

I need to find a variable extension file using wildcards ( *.txt , *.jpeg , *.doc ) on a disk ( c: ). 我需要在磁盘上使用通配符( *.txt*.jpeg*.doc )找到一个变量扩展文件( c: *.doc

I tried with the following function, but I can't make it recursive, and it's not working: 我尝试使用以下函数,但我无法使其递归,并且它不起作用:

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);
    }
}

Of course I tried it with a static value ( *.txt ) to see if it worked, but it didn't work when I called it from in main: 当然我尝试使用静态值( *.txt )来查看它是否有效,但是当我在main中调用它时它不起作用:

Recurse("C:\\*");
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);

        }
    }

i call the function in this mode: 我在这种模式下调用该函数:

Recurse("C:","C:"); 递归( “C:”, “C:”);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM