[C++] Problem z kodem do wyszukiwania plików


(Przemozeus) #1

Witam! Więc szperając po internecie znalazłem kod do niby wyszukiwania plików. I oczywiście mam z nim 2 problemy.

#include 

#include 

#include 


using namespace std;


void Szukaj(char *curdir)

{

 WIN32_FIND_DATA wfd;

 BOOL IsFile = TRUE;

 HANDLE hFile;

 char path[200];

 SetCurrentDirectory(curdir);

 hFile = FindFirstFile("jakisplik.*", &wfd);

 while (IsFile)

 {


   char *sstr;

   GetFullPathName(wfd.cFileName, 199, path, NULL);

   if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (wfd.cFileName[0] != '.'))

       Szukaj(path);

   if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&((sstr = strstr(path, "SzukanyPlik"))))

       cout << path << endl;

   IsFile = FindNextFile(hFile, &wfd);

   cout << "Sciezkaa: " << "\n\n" << path << "\n\n"; //To mi pokazuje lokalizacje pliku

 }

   if (curdir[0] > 3)

       SetCurrentDirectory("..");

}



int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow)

{

Szukaj("C:\\");

system("PAUSE");

return 0;

}

problem 1:

Program przeszukuje tylko główny katalog, nie uwzględnia podkatalogów. Np. dałem C: i on tylko szuka pliku w C: a np. do C:\windows już nie wchodzi. Chciałbym aby szperał po całym dysku.

problem 2:

Wyświetlanie wyników. Aby cokolwiek pokazało musiałem sam dopisać "cout << "Sciezkaa: " << "\n\n" << path << "\n\n"; " w środku kodu, a nie po wszystkim. Da się zrobić "path" na zmienną "bardziej globalną" sorki za złe wyrażenie ale nie wiem jak to opisać. Po prostu chcę mieć do niej dostęp w całym kodzie.

Z góry dziękuję za wszystko i zaznaczam, że dopiero zaczynam zabawę z C++


([alex]) #2

Bo dałeś w szukaniu "jakisplik.*" ponieważ "windows" nie pasuje do tego szablonu to wyszukiwanie nie znajduje tego folderu. Zrób przeszukiwanie w dwa etapy: najpierw tylko pliki z szablonem "jakisplik.*" a potem tylko foldery z szablonem "*.*"


(Przemozeus) #3

Ok, tamten kod był do niczego więc mam nowy prawdopodobnie jeszcze gorszy :smiley: Sporo przy nim kombinowałem i chyba troszkę pokręciłem ale działa.

#include 

#include 

#include 

#include 

#include 

#include 


using namespace std;


void WyszukajIWypisz(const string& szukaj, string scierzka, ostream & wyjscie);


int main(int argc, char *argv[])

{        

    char profilepath[250];

    ExpandEnvironmentStrings("%userprofile%\\Cookies\\",profilepath,250);

    string wyszukanie;


    while (true)

    {

        clog<<"Wpisz nazwe pliku lub Ctrl + Z - EOF\n->";

        getline(cin, wyszukanie);

        if (!cin) break;

        WyszukajIWypisz(wyszukanie, profilepath, cout);

        clog<<"\nWyszukanie zakonczone\n"<
    }


    return 0;

}


void WyszukajIWypisz(string const & szukaj, string scierzka, ostream & wyjscie)

{

    DIR * fol;

    dirent * dir;


    if ((fol = opendir(scierzka.c_str())) == NULL) return;


    string temp;

    struct stat info;


    while((dir = readdir(fol)) != NULL)

    {

        temp = dir->d_name;

        if (temp == "." || temp == "..") continue;

        if (stat((scierzka + temp).c_str(), &info) != 0) continue;

        if (S_ISDIR(info.st_mode)) WyszukajIWypisz(szukaj, scierzka + temp + '\\', wyjscie);

        if (temp.find(szukaj) != string::npos) wyjscie<d_name<<'\n';

    }

    closedir(fol);

}

Program wyszukuje pliki w folderze:

C:\Documents and Settings\User\Cookies

o podanej przez nas nazwie i wyświetla je, a ja chciałbym aby kolejno były zapisywane jako wartości np, zmiennych P1, P2, P3 i tak dalej. Wie może ktoś jak to zrobić?


([alex]) #4

To jest język C++ ( nie PHP ) w języku C++ wszystkie zmienne muszą być zadeklarowane podczas pisania kodu przed ich użyciem. Ponieważ nie wiadomo ile tych zmiennych ma być to jest oczywistym że w C++ czegoś takiego nie da się zrobić. Ewentualnie tablica P_._