Ordner löschen



  • Hiho,

    ich muss einen Ordner löschen. Gibts da etwas ähnlich SHCreateDirectory?
    Meine sowas wie SHRemoveDirectory?!

    Vielen Dank
    Fruggle


  • Mod

    SHFileOperation mit FO_DELETE!



  • Hallo Martin,

    ich habe es auch mit FO_DELETE versucht, muss ja aber
    \. mit angeben. Damit Lösche ich alle Unterordner und
    Dateien. Der Hauptordner bleibt jedoch stehen.

    Struktur:

    c:\
    |--->Ordner 1
    |--->Ordner 2 (LÖSCHEN inkl. Unterordner/Dateien)
    |--->Ordner 3

    Wenn ich nun den Ordner 2 löschen will, jedoch nicht Ordner 1 und Ordner 3,
    habe ich dann mit FO-DELETE automatisch schon verloren, oder mache ich nur etwas
    falsch?

    CString killit="c:\\ordner 2"; // geht nicht
    CString killit="c:\\ordner 2\\*.*"; // geht, aber Ordner selbst bleibt stehen
    
    SHFILEOPSTRUCT myFileOp;
    myFileOp.hwnd = 0;
    myFileOp.wFunc =FO_DELETE  ;
    
    myFileOp.pFrom = killit; 
    myFileOp.lpszProgressTitle = "Lösche Daten...";
    SHFileOperation(&myFileOp);
    if(SHFileOperation(&myFileOp) == 0) 
    { 
    
    MessageBox("gelöscht...");
    }
    else
    {
    	MessageBox("fehler...");
    }
    


  • An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.



  • Also mal ganz ehrlich bei mir schmiert die Anwendung an dieser Stelle
    komplett ab:

    SHFileOperation(&myFileOp);
    

    Da stimmt doch was nicht? Include ist für shellapi gesetzt...

    CString killit;
    killit="c:\\ordner2";
    killit+='\0';
    
    SHFILEOPSTRUCT myFileOp; 
    myFileOp.hwnd = 0; 
    myFileOp.wFunc =FO_DELETE  ; 
    
    myFileOp.pFrom = killit;
    SHFileOperation(&myFileOp); //und..CRASH..
    if(SHFileOperation(&myFileOp) == 0) 
    { 
    
    MessageBox("gelöscht..."); 
    } 
    else 
    { 
        MessageBox("fehler..."); 
    }
    

  • Mod

    Gesamte Struktur vorher auf 0 setzen bitte. Die Struktur hat noch mehr Member als Du initialisierst!

    SHFILEOPSTRUCT myFileOp; 
    ::ZeroMemory(&myFileOp,sizeof(myFileOp));
    


  • Ah, Danke. Muss man denn zwingend alle Member der Struktur ansprechen?
    Oder ist es nur sinnvoller, damit man "sauber" davor ist, ohne irgendwelche
    vormals initialisierten Member versehentlich anzuwenden?



  • Da du ja nicht genau weißt, auf welche Member der Struktur die Funktion dann zugreift, solltest du alle Member initialisieren explizit oder eben mit ZeroMemory o.ä.


  • Mod

    Ich habe mir ein ZeroMemory grundsätzlich angewöhnt. Auch wenn manche der Member durch Flags gesteuert werden ist es zumindest eine Gewohnheit, die vor Überraschungen schützt.



  • Martin Richter schrieb:

    Ich habe mir ein ZeroMemory grundsätzlich angewöhnt. Auch wenn manche der Member durch Flags gesteuert werden ist es zumindest eine Gewohnheit, die vor Überraschungen schützt.

    Zwar richtig, aber ich finde, man sollte dieses 'Clean-Up' nur dann einsetzen, wenn es wirklich nötig ist, da es gerade bei größeren Strukturen die Laufzeit doch stark beeinflußt. Wenn Du beispielsweise 95% der Strukturelemente explizit initialisierst, kannst Du die restlichen auch explizit auf 0 setzen. Bei der Verwendung von ZeroMemory (bzw. memset) würden dann alle explizit zugewiesenen Elemente doppelt initialisiert ➡ Langsamere Programmausführung (natürlich abhängig von der Komplexität der Struktur) 😉 .


Anmelden zum Antworten