Ordner mit mehreren Unterordnern

Tobsen84

Grünschnabel
Hallo erstmal,

ich habe folgendes Problem und finde im Moment keine passende Lösung dazu.
Ich lasse vom Nutzer einen Ordnerpfad angeben indem dann nach bestimmten Dateien gesucht werden soll. Soweit alles in Ordnung. Nun kann dieser Ordner mehrere Unterordner haben und die Unterordner selber auch noch. Wie kann ich meinen Code so abändern, das mein Programm später wirklich alle Ordner durchläuft?

Mit folgendem Code hatte ich es mit einem return zum Selbstaufruf in der Schleife versucht, aber der scannt nur den zuerst gefundenen Ordner. Ausserhalb der Schleife hatte ich es auch nochmal versucht gehabt mit einem return die Funktion sich selbst aufrufen zu lassen. Hier war der Effekt anders rum. Das Programm durchläuft nun den zuletzt gefundenen Ordner.
Im Moment sehe ich keine Chance meine Blockade zu durchbrechen. Ich habe den Code auf den mir wichtigen Teil gekürzt. Ich hoffe mir kann da jemand weiter helfen.

Code:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;

int j = 0;
char paths[200];


int files(char Eingabe[])
{
    char *pfad;
    char *path;
    char wert2[500];
    char pfad2[200];
    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    fHandle=FindFirstFile(Eingabe,&wfd);
    pfad = strtok(Eingabe, "*");
    strcpy(pfad2, pfad);
    do
    {
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
        {
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //wenn das Gefundene ein Ordner ist
            {
                MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0);

                if(pfad != "*" || pfad != " ")
                {
                    strcpy(Eingabe, pfad2);
                    strcat(Eingabe, wfd.cFileName);
                    strcat(Eingabe, "\\*");
                    strcat(paths, Eingabe);
                    strcat(paths, "#");
    
                    return (files(Eingabe)); //so geht er in den zuerst gefundenen Unterordner
                }
            }
            else
            {
                MessageBox(0,wfd.cFileName,"Folgende Datei gefunden:",0);
            }
        }
    }while (FindNextFile(fHandle,&wfd));
    //return (files(Eingabe));
    getchar();
    FindClose(fHandle);
}


int main()
{
    char *ptr;
    char *pfad;
    string wert = "";
    //char wert2[500];
    string werte = "";
    char Eingabe[500];

    printf("\nBitte den Pfad zum Ordner eingeben!\nEingabe: ");
    scanf("%s",Eingabe); //Eingabe des Pfades, wo sich der gewünschte Ordner befindet
    if(j == 0)
    {
        strcpy(paths, "");
        j++;
    }
    strcat(Eingabe, "*");
    files(Eingabe);
    return 0;
}
 
Hi,

das ist ein typisches Problem was mit Rekursion gelöst werden kann.
Also keine do-while Schleife sondern einen rekursiven Aufruf deiner Funktion.

So gehst du automatisch jeden Ordner und Unterordner durch.
Hattest du schonmal mit Rekursion zu tun?

Wenn nicht poste ich dir mal ein Beispiel.
 
Das wäre klasse so ein Beispiel.
Ich dachte die Schleife brauche ich zum durchlaufen der Ordner, da ich ja auch die Dateien aus den Ordnern noch brauche und bearbeiten möchte.
 
Ja, brauchst du auch.

Mach das folgendermaßen:

Du schreibst eine Funktion welche deinen Ordner durchgeht, übergabe ist das Verzeichnis was durchsucht werden soll.

Nun wenn du auf einen Ordner beim durchstöbern triffst, startest du die Funktion innerhalb der Funktion nocheinmal, nur mit dem derzeitigen Order + dem Unterordner.

Das geht dann solange bis alle Ordner + Unterordner ( .. und deren Unterordner ) durch sind, sowas nennt sich einen rekursiven Durchlauf.

Also einen immer fortführenden Durchlauf bis nichts mehr da ist.
 
Habe es geschafft und das Programm durchläfut nun den Ordner und all seine Unterordner. Nun tut sich ein anderes Problem auf. Die Dateien, die sich in den Ordnern befinden sollen bearbeitet werden. Dazu lese ich diese Zeilenweise aus und speicher Zeilen mit Inhalt in meine Variable. Datei wird wieder zugemacht und dann zum überschreiben geöffnet.
Hier tritt nun mein Problem auf. Leider kenne ich mich in C++ noch nicht so wirklich aus. Auf jedenfall öffne ich die Datei dann mit
Code:
outline.open(value2, ios::out|ios::ate);
Mein Programm schreibt auch alles brav in die Dateien wieder rein, aber bei manchen stehen nur noch diese [][] Vierecke drin. Meine Vermutung geht dahin, das es etwas mit dem Inhalt der Dateien zu tun hat. Wenn ich da nichts verwechsel sind da manchmal Hexadezimale Werte in den Dateien enthalten. Dachte dem sei es egal und er schreibt es einfach so wies da stand wieder rein. Vielleicht auch noch wichtig, der Datentyp ist "inf" den ich bearbeiten möchte.
Ich hoffe, ich habe mein Problem relativ gut beschrieben.
 
Hallo,
du öffnest die Datei mit ios::eek:ut | ios::ate. Bist du dir bewusst, dass du damit an das Ende der Datei etwas anhängen wirst? Überschrieben wird nix.
 
Ehrlich gesagt nein. Da werde ich mir das wohl nochmal genauer anschauen müssen wie man Dateien in C++ lesen und schreiben kann.
 

Neue Beiträge

Zurück