Parameter an rekursive Funktion übergeben



  • Hallo,

    ich bins wieder;-)
    Also ich habe erneut ein Problem. Ich würde gerne eine rekursive Funktion basteln. Allerdings weiß ich nicht so genau wie ich den Parameter übergeben soll.
    Die Funktion sieht ungefähr so aus und ich würde ihr gerne einen string übergeben.
    Wer es ganz genau wissen will:

    bool Rekursive_Datei_Suche(string StartFo)
    {
        HANDLE Rekursiv_Datei_Handle;
        WIN32_FIND_DATA Rekursiv_Datei_Structur;
    	string StartFo2 = "";
        string StartFoFE = StartFo + "\\*";
    
        Rekursiv_Datei_Handle = FindFirstFile(StartFoFE.c_str(), &Rekursiv_Datei_Structur);
        do
        {
    		string Rekursiv_string_Dateiname = Rekursiv_Datei_Structur.cFileName;
            if (((Rekursiv_Datei_Structur.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 ))
    		{
    			if(Rekursiv_string_Dateiname != "."  && Rekursiv_string_Dateiname != "..")
    			{
    				StartFo2 = StartFo + "\\" + Rekursiv_Datei_Structur.cFileName;
    				Rekursive_Datei_Suche(StartFo2);
    			}
    		}
    		else
    		{
    			if((Rekursiv_string_Dateiname.find(".jpg") != std::string::npos) || (Rekursiv_string_Dateiname.find(".JPG") != std::string::npos) || (Rekursiv_string_Dateiname.find(".jpeg") != std::string::npos) || (Rekursiv_string_Dateiname.find(".JPEG") != std::string::npos) || (Rekursiv_string_Dateiname.find(".BMP") != std::string::npos) || (Rekursiv_string_Dateiname.find(".bmp") != std::string::npos))
    			{
    				string Rekursion_Dateipfad = StartFo + "\\" + Rekursiv_Datei_Structur.cFileName;
    				if(!ueberpruefen_ob_Datei_geladen_wurde(Rekursion_Dateipfad))
    				{
    					Datei_an_Server_senden(Rekursion_Dateipfad, (string)Rekursiv_Datei_Structur.cFileName);
    					geladene_Datei_in_Datei_schreiben(Rekursion_Dateipfad);
    				}
    			}
            }
        }
    

    Ich versuche also eine rekursive Dateisuche nachzubilden.

    File_Search_Thread proc
    
        ;Mach was mit dem String
        call File_Search_Thread
        ret
    
    File_Search_Thread endp
    

    Jetzt habe ich eine globale Variable mit der ich arbeiten würde. Aber so richtig scheint das ja nicht zu funktionieren wenn ich genau drüber nachdenke. Bedeutet also, dass ich jedes mal die aktuelle Variable überschreiben würde obwohl ich, wenn ich eine Instanz wieder verlassen würde, die alte ja noch brauche. Wie kann ich das geschickt lösen?



  • ...Irgendwie habe ich noch nicht ganz erfasst, was ueberhaupt dein Problem ist, bzw. was das ueberhaupt mit Assembler zu tun hat.
    Willst du den C++-Code dort in Assembler umsetzen? Dann waere mein Tipp, dir den Output deines Compilers anzusehen.

    Sonst noch allgemein ein Tipp zu solchen rekursiven Verzeichnis-Ablaufen: Wenn du nicht jedes Mal den kompletten Pfad in jede Rekursionsstufe mitschleppen willst, kannst du dir stattdessen auch jeweils die Laenge (oder das End-Offset) eines globalen Pfad-Strings merken und so in jeder Stufe immer Pfadteile an- oder ab-koppeln.



  • Mach es Iterativ, mit einem Stack, das ist leichter. Auf den Stack haust du vor Beginn das Oberverzeichnis, dann hast du eine Schleife die so lange läuft wie im Stack was ist. Du nimmst dann das Verzeichnis vom Stack und gehst das mit FindFirst/FindNext durch, sobald du ein Verzeichnis findest speicherst du das auf dem Stack. Alle gefundenen Verzeichnisse landen auf dem Stack und werden dann im nächsten Durchgang der Schleife abgearbeitet (also eines nach dem anderen).

    Ungefähr so (ist so natürlich nicht kompilierbar ;)):

    std::stack s;
    
    while(!s.is_empty()) {
        std::string dir = s.pop();
        FindFirstFile();
    
        std::cout << "In Verzeichnis " << dir << std::endl;
    
        while(FindNextFile()) {
             if(is_dir()) {
                 s.push(dir);
             } else {
                 std::cout << "Datei " << std::endl;
             }
        }
    }
    

Anmelden zum Antworten