rekursive Dateisuche



  • habs fast geschafft
    muss nur noch einen string zerlegen und mit if (s == "txt") selektieren.

    int main() {
    
    std::string s = "C:/Users/psi/Desktop/test.txt";
    std::string delimiter = ".";
    
    size_t pos = 1;
    std::string token;
    while ((pos = s.find(delimiter)) != std::string::npos) {
        token = s.substr(0, pos);
        std::cout << token << std::endl;
        s.erase(0, pos + delimiter.length());
    }
    
    if (s == "txt") {
    	std::cout << s;
    }
    
    //std::cout << s << std::endl;       
    }
    

    wie kann es sonst funkionieren?



    1. falsches subforum
    2. was ist an deinem code denn rekursiv?
    3. hast du dir das Ergebnis angesehen und ist es wirklich das was du haben willst?
    4. was willst du eigentlich haben?


  • Das ist der Code:

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    void listDir(const char * dirn);
    
    int main()
    {
        listDir("C:\\Program Files\\");
        return 0;
    }
    
    void listDir(const char * dirn)
    {
        char dirnPath[1024];
        sprintf(dirnPath, "%s\\*", dirn);
    
        WIN32_FIND_DATA f;
        HANDLE h = FindFirstFile(dirnPath, &f);
    
        if (h == INVALID_HANDLE_VALUE) { return; }
    
        do
        {
            const char * name = f.cFileName;
    
            if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) { continue; }
    
            char filePath[1024];
            sprintf(filePath, "%s%s%s", dirn, "\\", name);
    
            //cout << filePath << endl;
    
            std::string s = "scott.tiger.mushroom";
    std::string delimiter = ".";
    
    size_t pos = 0;
    std::string token;
    while ((pos = s.find(delimiter)) != std::string::npos) {
        token = s.substr(0, pos);
        std::cout << token << std::endl;
        s.erase(0, pos + delimiter.length());
    }
    std::cout << s << std::endl;
    
            if (f.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            {
                listDir(filePath);
            }
    
        } while (FindNextFile(h, &f));
        FindClose(h);
    }
    

    Aber ich muss jetzt noch die Dateiendungen selektieren damit er alle log Dateien rausfiltert und ich die Dateien löschen kann.

    Grüße



  • Ich versteh nicht warum der if(string == "txt") ... nicht kappiert!

    using namespace std;
    
    int main() {
    	char string[] = "test.txt";
    	char delimiter[] = ".";
    	char *ptr = strtok(string, delimiter);
    
    	while(ptr != NULL) {
    
    		if (ptr == "txt") {
    
    		printf(ptr);
    		}
    
    	ptr = strtok(NULL, delimiter);
    	}
    }
    

    wenn ich hier die Dateiendung filtern kann, funktioniert mein rekursiv löschen Programm.



  • Warum postest du nicht mal kompletten Code statt nur wirrer Schnipsel?
    Da brauchst du dich nicht wundern, daß nur ich drauf antworte.

    if (ptr == "txt")

    Naja, da musst du wohl noch ein bbbißchen C lernen.

    Für Tips sind andere, nettere Mitglieder zuständig. Ich hab schon längst meine eigene A*loch-fraktion gebildet.

    Ok, doch ein Tip:
    Du hast nicht den Unterschied zwischen einem pointer und dessen Inhalt verstanden.
    Wahrscheinlich hast du pointer überhaupt nicht verstanden.

    C ist nicht C++, C ist eine recht bequeme Version der Assemblerprogrammierung.
    C++ ist was für die Modernen, C ist old school.



  • Für dich nochmal das komplette Programm, mit der String Funktion.

    #include <stdio.h>
    #include <string.h>
    #include <windows.h>
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    void listDir(const char * dirn);
    
    int main()
    {
        listDir("C:\\Program Files\\");
        return 0;
    }
    
    void listDir(const char * dirn)
    {
        char dirnPath[1024];
        sprintf(dirnPath, "%s\\*", dirn);
    
        WIN32_FIND_DATA f;
        HANDLE h = FindFirstFile(dirnPath, &f);
    
        if (h == INVALID_HANDLE_VALUE) { return; }
    
        do
        {
            const char * name = f.cFileName;
    
            if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) { continue; }
    
            char filePath[1024];
            sprintf(filePath, "%s%s%s", dirn, "\\", name);
    
        char string[] = filePath;
    	char delimiter[] = ".";
    	char *ptr = strtok(string, delimiter);
    	while(ptr != NULL) {
    		if (ptr == "log") {
    
    		printf(ptr);
    
    		}
    	ptr = strtok(NULL, delimiter);
    	}
    
            std::string s = "scott.tiger.mushroom";
    std::string delimiter = ".";
    
    size_t pos = 0;
    std::string token;
    while ((pos = s.find(delimiter)) != std::string::npos) {
        token = s.substr(0, pos);
        std::cout << token << std::endl;
        s.erase(0, pos + delimiter.length());
    }
    std::cout << s << std::endl;
    
            if (f.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            {
                listDir(filePath);
            }
    
        } while (FindNextFile(h, &f));
        FindClose(h);
    }
    

    Kannst du mir nicht helfen oder willst du nicht?



  • Er kann, will aber nicht.



  • Ich dachte das dies hier ein Forum ist wo man Hilfe bekommt wenn man sie braucht.
    Ich würde doch auch anderen helfen wenn ich könnte.
    Ist nicht das der Sinn von Information, das man sie verbreitet?



  • Der code ist eine wilde Mischung von C und C++, den du dir anscheinend zusammenkopiert hast.
    Was macht Hilfe für einen Sinn wenn du ganz offensichtlich nix von dem code kapiert hast?
    Ich müsste dir den ganzen Kram komplett neu schreiben - das ist aber nicht der Zweck dieses Forums.



  • Um euch zu ärgern das Ganze nochmal in vb.

    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim oDir As IO.DirectoryInfo
            oDir = New IO.DirectoryInfo("C:\Neuer Ordner")
            Rekursiv(oDir)
        End Sub
    
        Private Sub Rekursiv(ByVal oDir As IO.DirectoryInfo)
            Dim oSubDir As IO.DirectoryInfo
            Dim oFile As IO.FileInfo
            For Each oFile In oDir.GetFiles()
                With oFile
    
                    If (.Extension = ".log" Or .Extension = ".old") Then
    
                        ListBox1.Items.Add(.DirectoryName & "\" & .Name)
                    End If
    
                End With
            Next
    
            For Each oSubDir In oDir.GetDirectories()
                Rekursiv(oSubDir)
            Next
        End Sub
    End Class
    


  • karas schrieb:

    Um euch zu ärgern

    Du willst also keine Hilfe. Macht hier mal jemand zu?



  • Was soll das für arbeit machen so ein mini Code zu proggen?
    Hätte gern Hilfe angenommen aber hier in diesem Forum wollte mir Niemand helfen.



  • karas schrieb:

    Was soll das für arbeit machen so ein mini Code zu proggen?

    Nervige Arbeit.



  • Ich hätte da schon fertige Lösungen (von mir programmiert und nicht planlos zusammengeschustert).

    Aber wie theta sagte: Er kann, will aber nicht.
    und wie Swordfish sagte: Nervige Arbeit. (für Andere, die zu faul zum lernen sind die Arbeit zu machen)

    EDIT:

    karas schrieb:

    Was soll das für arbeit machen so ein mini Code zu proggen?

    1. Dann mach dir's doch selber
    2. Wer das Wort "proggen" benutzt ist für mich schon von vorneherein raus
    3. So wie das Ergebnis aussieht, ist es mehr als nur mini code (ist aber auch weit entfernt von Raketenwissenschaft)


  • Ich danke euch trozdem für eure Hilfe.



  • EOP schrieb:

    1. Wer das Wort "proggen" benutzt ist für mich schon von vorneherein raus

    *meld*

    @karas:
    Ich würde es gar nicht rekursiv proggern, sondern ungefähr wie
    https://www.c-plusplus.net/forum/267713-full

    Ups, nu haste nicht meinen IntrusiveDoubleLinkedRing und so… Leider auch kein Fertig-Code für Dich. Aber mit wein wenig viel Wegwerfen sollte es klappen.


Anmelden zum Antworten