dateimanager



  • Julio schrieb:

    JA das mit findfirstfile etc hab ich ja schon, nur das Problem ist das ich an jeder Stelle auf Befehl wieder ins Überverzeichnis wechseln will

    Ja und ? Mach doch 😃 . Du musst dann eben das übergeordneter Verzeichnis entweder neu durchzählen lassen (gründlicher, dauert aber länger) oder Du speicherst den Inhalt der Verzeichnisse in entsprechenden Datenstrukturen.



  • Hallo, so hab mich mal hingesetzt und da was zusammengeproggt (auch wenn viell ned so sauber):

    Das Programm listet alle Dateien auf und mit einem DIR-Befehl auch weitere.

    einziges Problem:
    Wie soll ich (bei möglichst gleichem source) auch den CD-BEFEHL einbauen?

    also den wo ich ins letzte zurückspringe?

    das hab ich eig eh bedacht denn wenn die Funktion aufhöhrt ist man ja wieder im überordner.

    Leider passen dann die Stringfunktionen nichtmehr da sie durch die nächste instanz von dir ja verändert werden.

    #include <stdio.h>
    #include <windows.h>
    #include <string.h>
    
    int dir(char param[]);
    char stern[4]="**";
    char option[200];
    char thisparam[200];
    char Verzeichnis[200]="";
    char doppelslash[3]="//";
    char BackupSlash[200];
    
    int main()
    
    {
    char param[200]="C:";
    dir(param);
    
    return 0;
    }
    
    int dir(char param[])
    
    {
    
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    system("cls");
    
    memset(Verzeichnis,0,sizeof(Verzeichnis));
    
    lstrcat(Verzeichnis,param);
    lstrcat(Verzeichnis,doppelslash);
    lstrcat(param,doppelslash);
    lstrcat(Verzeichnis,stern);
    FILE *test;
    test=fopen("verzeichnis.txt","w+");
    fprintf(test,"%s",Verzeichnis);
    fclose(test);
    
    strcpy(BackupSlash,Verzeichnis);
    
    fHandle=FindFirstFile(Verzeichnis,&wfd); 
    
    do 
    { 
        // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert) 
        // hier könnte man z.B. auch mit lstrcmp auf . und .. vergleichen, was allerdings nicht ganz so effizient ist 
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
                       printf("%s",wfd.cFileName);
    		      printf(" DIR\n");
    
    		//SUCHFUNKTION nicht vergessen
            } 
            else 
            { 
               printf("%s\n",wfd.cFileName);
            } 
    
        } 
    
    } 
    while (FindNextFile(fHandle,&wfd)); 
    
    scanf("%s",&option);
    if (option=="DIR");
    scanf("%s",&thisparam);
    lstrcat(param,thisparam);
    dir(param);
    
    FindClose(fHandle);
    
    return 0;
    
    }
    


  • Sry, Kommentare im Quelltext bitte nicht beachten.



  • bitte helft mir, ich bin noch immer nicht weitergekommen 🙂



  • Die einfachste Variante dürfte wohl sein "\.." an den Pfad anzuhängen, und den danach zu re-normalisieren. GetFullPathName sollte zum re-normalisieren funktionieren.

    Wenn du einfach nur willst dass "cd .." funktioniert brauchst du garnix speziell zu handhaben, du hängst einfach ("\" + input) an den aktuellen Pfad an und re-normalisiert den Pfad danach. Das geht dann für "cd .", "cd ..", "cd blah", "cd .\blah" und auch für irre Sachen wie "cd x\.\.\.\.\..\x\.\..\x\..\..".

    Die Windows Shell (cmd.exe) behandelt macht das auch so oder so ähnlich - statt "cd .." kannst du ohne weiteres auch "cd .\foo\..\.." schreiben - ob "foo" dabei existiert oder nicht spielt dabei keine Rolle, da der Pfad re-normalisiert wird _bevor_ geprüft wird ob es ihn überhaupt gibt 😉



  • Danke für die Antwort,

    also das mit den doppelslashes hab ich eh gemacht, leider weiss ich nicht ganz was du mit renormalisieren meinst, aber du hast mich trotzdem auf ne Idee gebracht.

    Ich arbeite sie mal aus und dann poste ich was dabei rausgekommen ist^^



  • Hallo,

    hmmm also der neue Source sieht so aus:

    #include <stdio.h>
    #include <windows.h>
    #include <string.h>
    
    //Notizen: Am Schluss bearbeiten, lokal speichern
    
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    int dir(char param[]);
    
    char option[200];
    char doppelslash[3]="\\";
    char stern[4]="**";
    
    int main()
    
    {
    char param[200]="C:\\";
    
    dir(param);
    
    return 0;
    }
    
    int dir(char param[])
    
    {
    
    system("cls");
    
    char parameter[200]="";
    lstrcat(parameter,param);
    
    char VerzeichnisVersion[200]="";
    lstrcat(VerzeichnisVersion,parameter);
    lstrcat(VerzeichnisVersion,stern);
    
    fHandle=FindFirstFile(VerzeichnisVersion,&wfd); 
    
    do 
    { 
    
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
                       printf("%s",wfd.cFileName);
    		      printf(" DIR\n");
    
    		//SUCHFUNKTION nicht vergessen
            } 
    
            else 
            { 
               printf("%s\n",wfd.cFileName);
            } 
    
        } 
    
    } 
    while (FindNextFile(fHandle,&wfd)); 
    
    FindClose(fHandle);
    
    char thisparam[200];
    
    scanf("%s",&option);
    if (option=="DIR")
    {
    scanf("%s",&thisparam); //liest Verzeichnis-Ergänzung ein
    lstrcat(param,thisparam);
    lstrcat(param, doppelslash);
    dir(param);
    
    return 0;
    }
    
    }
    

    Jetzt steh ich aber in einer totalen Sackgasse.
    Denn:

    Auf der einen Seite will, dass die dir funktion aufhöhrt, sofern der dir befehl nicht eingegeben wird, auf der anderen seit muss die um eine Stufe niedere Instantz aber weitermachen wenn die dir funktion aufhöhrt.

    Die einzige Lösung die ich sehe sind zwei verschiedene, ähnliche Funktionen
    die sich gegenseitig aufrufen.

    Hmmm hat jmd von euch ne bessere Idee?

    Ich häng da nämlich echt fest.

    mfg



  • meine idee waere das du das auslesen des verzeichnisses auslagerst

    //

    int dir(char param[]){
    .
    .
    .
    ReadContent();
    .
    .
    .
    }
    
    void ReadContent(){
        fHandle=FindFirstFile(VerzeichnisVersion,&wfd);
        do{
        .
        .
        }while(..);
        FindClose(fHandle);
    }
    

    da du mit dir ja immer nur den inhalt des aktuellen verzeichnisses brauchst und nicht tiefer, brauchst du auch nichts rekursives



  • Hallo, thx für die antwort,gut, denn diese Idee ist mir auch gekommen nur weiss ich eben leider ned wie ich dann das mit dem Pfad anpassen regeln soll somit bin ich da auch steckengeblieben.



  • Hallo Leute,

    sry ich hab da was verwechselt/missverstanden.

    Auch bei der cmd wird bei dir ja nur angezeigt und der Pfad nicht verändert.

    ne andere Frage:

    wenn ich jetzt zb drei mal dir eingebe

    gibts dann bei der cmd irgendeinen befehl um dahin zurückzukommen wo ich mit dem zweiten dir hingekommen bin?

    oder muss ich wieder vom ausgangsverzeichnis zwei mal dir eingeben?

    Und: in den überordner kommt man doch mit cd oder?

    MFG



  • zurueckkommen mit dir ?

    dir zeigt doch nur das aktuelle verzeichnis an - und mehr macht doch deine funktion auch nicht
    verzeichniswechsel sind doch immer mit cd path oder cd.. fuer zurueck

    das man mit dir ein verzeichnix wechselt usw ist mir neu - also macht die aussage:

    gibts dann bei der cmd irgendeinen befehl um dahin zurückzukommen wo ich mit dem zweiten dir hingekommen bin?

    irgendwie keinen sinn

    wenn ich jetzt zb drei mal dir eingebe

    bekommst du drei mal den inhalt des aktuellen verzeichnisses angezeigt
    und drei mal dir hintereinander ist kein sinnvoller command

    Und: in den überordner kommt man doch mit cd oder?

    mit cd.. ja

    .. bedeutet eins davor
    . bedeutet aktuelles verzeichnis

    in verzeichnis wechseln:

    cd Path1\Path2
    

    eins zurueck

    cd..
    


  • Sry, ich formulier immer etwas ungenau,

    zb diese Einagabe

    C:\dir
    dir Dokumente und Einstellungen
    dir Username

    so meinte ich drei dir befehle, sry.

    und was ich jetzt gerne machn würde is, während ich bei der Auflistung mit dir im Username Verzeichnis bin, durch einen befehl wieder ins Überverzeichnis, dieser Kette kommen. (bei meinem Programm)

    MFG



  • Ich hab mir das so überlegt, dass ich es bei der Rekursion so gestalte, dass wenn die Funktion keinen dir befehl bekommt 0 zurückgibt und die Instanz die sie aufgerufen hat ,also f(n-1) sozusagen, nochmal checkt obs cd oder eingabetaste ist.

    bei eingabetaste wird das hiesige Verzeichnis aufgelistet, bei CD gehts wieder eine Instanz runter usw.

    Leider klappt die Umsetzung noch nicht so ganz



  • "nochmal checkt obs cd oder eingabetaste ist. ", damit meine ich eine erneute Abfrage



  • Also in etwa so, aber leider weiss ich nicht wie das genau gehen soll.

    #include <stdio.h>
    #include <windows.h>
    #include <string.h>
    
    //Notizen: Am Schluss bearbeiten, lokal speichern
    
    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    
    int dir(char param[]);
    
    char option[200];
    char doppelslash[3]="\\";
    char stern[4]="**";
    
    int main()
    
    {
    char param[200]="C:\\";
    
    dir(param);
    
    return 0;
    }
    
    int dir(char param[])
    
    {
    
    char parameter[200]="";
    lstrcat(parameter,param);
    
    char VerzeichnisVersion[200]="";
    lstrcat(VerzeichnisVersion,parameter);
    lstrcat(VerzeichnisVersion,stern);
    
    Anfang:
    fHandle=FindFirstFile(VerzeichnisVersion,&wfd);
    
    do
    {
    
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
        {
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                       printf("%s",wfd.cFileName);
                       printf(" DIR\n");
    
            //SUCHFUNKTION nicht vergessen
            }
    
            else
            {
               printf("%s\n",wfd.cFileName);
            }
    
        }
    
    }
    while (FindNextFile(fHandle,&wfd));
    
    FindClose(fHandle);
    
    char thisparam[200];
    
    scanf("%s",&option);
    if (option=="DIR")
    {
    scanf("%s",&thisparam); //liest Verzeichnis-Ergänzung ein
    lstrcat(param,thisparam);
    lstrcat(param, doppelslash);
    dir(param);
    if (option=="DIR")
    {
    scanf("%s",&option);
    goto Anfang;
    }
    return 0;
    }
    
    return 0;
    
    }
    

Anmelden zum Antworten