Löschen von mehreren Dateien



  • Hi,

    Ich bin eigentlich PHP-Programmierer, musste mir aber für lokale Arbeiten C++ anlernen. Natürlich versuche ich mich nur bei einfachen Sachen, bei allem anderen fehlen mir viele Grundlagen (Pointer usw.).

    Meine ersten 1500 Zeilen Code funktionieren schon mal ganz gut, aber jetzt scheiter ich an diesem Problem:

    Ich möchte mehrere Zeilen gleichzeitig löschen.

    Meine Lösung die ineffizient ist aber funktioniert:

    SHFILEOPSTRUCT fileop;
        fileop.hwnd   = NULL; 
        fileop.wFunc  = FO_DELETE;
        fileop.pFrom  = "C:\\test.txt\0\0";
        fileop.pTo    = NULL;
    
    SHFileOperation(&fileop);
    

    Damit muss ich aber alles einzeln löschen und das ist sehr langsam. (ist natürlich eine Funktion, ich habs jetzt nur zur Vereinfachung kurz geschrieben)

    Meine Wunschlösung, die aber nicht funktioniert:

    SHFILEOPSTRUCT fileop;
        fileop.hwnd   = NULL; 
        fileop.wFunc  = FO_DELETE;
        fileop.pFrom  = "C:\\test.txt\0c:\\test2\0\0";
        fileop.pTo    = NULL;
    
    SHFileOperation(&fileop);
    

    Falls ihr es testet und gleich drauf kommt, dass es doch geht...
    es geht, aber nur wenn beide Dateien vorhanden sind. Fehlt eine, löscht er gar nichts.

    Und genau das ist mein Problem. Ich versteh nicht, warum er nicht alle Dateien die angegeben sind löscht, ob sie nun vorhanden sind oder nicht.

    Jemand Rat?

    Danke euch im voraus!



  • fileop.pFrom  = "C:\\Pfad\\*.*"
    


  • Das kenne ich, aber danke für deinen Vorschlag. Leider ist es eine Liste spezieller Dateien, weshalb ich * nicht nutzen kann. Noch eine andere Idee?



  • Ich gehe davon aus, dass die Liste demnach schon vor dem Kompilieren bekannt ist?
    Dann lege doch ein String-Array an oder gleich ein Struct.

    Beispiel Struct:

    #define MAX_FILELISTSIZE 50    // Anzahl der Dateien
    
    typedef struct SPECIALFILELIST
    {
        char file[256];    //Dateipfad bzw. -name
        bool deleted;      //wurde Datei erfolgreich gelöscht? (zur Auswertung)
    };
    
    [...]
    
    SPECIALFILELIST *myFileList = new SPECIALFILELIST[MAX_FILELISTSIZE]; //Speicher für die Liste anfordern
    
    //Liste befüllen
    lstrcpy (myFileList[0].file, "C:\\Datei1.dat\0");
    lstrcpy (myFileList[1].file, "C:\\Datei2.dat\0");
    
    [...]
    
    //Dateioperation vorbereiten
    SHFILEOPSTRUCT fileop;
    fileop.hwnd   = NULL;
    fileop.wFunc  = FO_DELETE;
    fileop.pTo    = NULL;
    
    //Operation für jedes Element durchführen
    for (int i = 0; i < MAX_FILELISTSIZE; i++)
    {
        lstrcpy (fileop.pFrom, myFileList[i].name);
        if (SHFileOperation (&fileop) == 0)
            myFileList[i].deleted = true;
        else
            myFileList[i].deleted = false;
    }
    
    [...]
    
    delete [] myFileList; //Speicher freigeben
    

    Natürlich ließe sich hier auch mit einer veketteten Liste oder gleich einem Vector bzw. anstatt einem char-Array mit string arbeiten. Außerdem könnte auch die Befüllung der Liste dynamisch erfolgen bzw. in eine Funktion ausgelagert werden. Da du aber meintest, dass dir einige Grundlagen fehlen, reicht das vielleicht auch schon.

    Edit: Mir ist gerade aufgefallen, dass es dir um die Geschwindigkeit geht, also ist dieser Post wohl unnötig ...



  • Ja, leider. So hab ich es derzeit gelöst. (mit einer Funktion)

    Danke dir trotzdem für deinen Versuch.

    Was ich an meiner eigenen Lösung einfach nicht verstehe ist, warum müssen diese Dateien genau so vorhanden sein, damit sie gelöscht werden können. Macht eigentlich keinen Sinn und kann wohl auch nicht so gedacht sein. Ich gehe derzeit eher davon aus, dass ich einen Fehler in meinem Code habe bzw. irgendetwas berücksichtigen muss. Google spuckt auch nichts brauchbares aus.

    Gibts vielleicht einen anderen Weg, wie man sehr schnell eine große Menge (mir genau bekannte) Dateien löscht? (außer system() )



  • Wie kommst Du denn auf die Idee, dass das schneller ist, als in einer Schleife für jede zu löschende Datei

    DeleteFile(dateiName);
    

    aufzurufen?



  • Gute Frage. Werde heute mal einen Speedtest machen. Wäre schön, wenns so einfach wäre.



  • Hab gerade Tests gemacht. Sieht so aus, als wenn auf meinem System keine Probleme bestehen. Dann liegts wohl eher an den verschiedenen Clients und wahrscheinlich blockieren die verschiedenen Antivirus-Programme die File-Vorgänge.

    Zur Vollständigkeit meine Tests:

    zu löschen: 8 Files mit gesamt 344MB

    mit SHFILEOPSTRUCT jede Datei einzeln: <1 Sekunde

    mit SHFILEOPSTRUCT alle Dateien gleichzeitig: <1 Sekunde

    mit DeleteFile jede Datei einzeln: <1 Sekunde

    Somit dürfte hier nicht mein Geschwindigkeitsleck sein. Dann werd ich mal weiter suchen, wo in meiner Anwendung etwas blockiert wird.

    Ich danke euch für eure Unterstützung. Beim nächsten mal sollte ich vor dem fragen einen Speedtest machen. 🕶


Anmelden zum Antworten