Deutsch
Forum

Verzeichnis mit allem enthaltenen Dateien und Unterverzeichnissen (restlos) löschen

 
- Seite 1 -



Julian
Schmidt
Wie kann man ein Verzeichnis am elegantesten mit allen Unterverzeichnissen und allem enthaltenen Dateien löschen?
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
24.07.2011  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


Dieter
Zornow
Warum nimmst du nicht einfach die API zum löschen. Hier ist ein flexibler Code für Löschen, Kopieren Umbenennen und Bewegen. Je nach Parameter kannst du in den Papierkorb oder auch nicht löschen, ganz wie du willst. Das erspart doch den ganzen Hickhack und arbeitet zuverlässig. Im Beispiel wird ohne Nachfrage ein Verzeichnis mit Unterverzeichnissen nicht in den Papierkorb gelöscht
' Parameter 1: Auszuführende Operation=COPY, DELETE, RENAME, MOVE
' Parameter 2: Quelldatei(en)
' Parameter 3: Zielldatei(en)
' Parameter 4: 0 = Benutzer fragen, 1= ohne Nachfrage löschen
' Parameter 5: 0 = In Papierkorb verschieben, 1= "endgültig" löschen
' Parameter 6: 0 = Abbrechen bei vorhandener Datei, 1 = Kopie der Datei anlegen

Proc SHFileoperation

    Parameters operation$,File$,File2$,confirm%,recycle%,can%
    Declare opstruct#,file#,file2#,title#,operation&
    Var FOF_Flag% = 1 | 512 |  2048'FOF_MULTIDESTFILES,FOF_NOCONFIRMMKDIR,FOF_NOCOPYSECURITYATTRIBS
    Dim title#,24
    string title#,0 = "Fileoperation Progress"

    Select upper$(operation$)

        CaseOf "RENAME"

        operation&=4

        CaseOf "COPY"

        operation&=2

        CaseOf "MOVE"

        operation&=1

        CaseOf "DELETE"

        operation&=3

    endselect

    case confirm%:confirm%=16
    Casenot recycle%:recycle%=64

    If can%

        FOF_Flag% = FOF_Flag% | confirm% | recycle% | $20 | 8'$20 = FOF_WANTMAPPINGHANDLE 8 = FOF_RENAMEONCOLLISION

    Else

        FOF_Flag% = FOF_FLAG% | confirm% | recycle%'16 = FOF_NOCONFIRMATION,64 = FOF_ALLOWUNDO

    endif

    Dim opstruct#,30:Dim file#,(Len(file$)+2):Dim file2#,(Len(file2$)+2)
    String file#,0=(file$+Chr$(0)):String file2#,0=(file2$+Chr$(0))
    Long opstruct#,0=GetActiveWindow()' Handle des aufrufenden Fensters
    Long opstruct#,4=operation&'Welche Dateioperation gemacht wird
    Long opstruct#,8=file#' pfrom : hier die Dateien für die Operation
    Long opstruct#,12=file2#'pto hier die Zieldateinamen oder 0
    Word opstruct#,16=FOF_Flag%
    Long opstruct#,18=0'Bei abbruch steht hier 1 nur bei langen Operationen
    Long opstruct#,22=0' muss immer Null sein, hier wird handle für SHNameMappings gesetzt bei Kopie
    Long opstruct#,26=Title#'Überschrift des Fortschrittsdialogs bei langen Operationen
    Var FEHLER&=External("SHELL32","SHFileOperationA",opstruct#)

    IF (long(opstruct#,18)=1)

        MessageBox("Die Dateioperation wurde abgebrochen!","Abbruch durch Benutzer!",64)

    ELSEIF (Fehler& <> 0)

        MessageBox(str$(fehler&),"Es ist ein Fehler aufgetreten",16)

    EndIf

    If val($WinVer)> 5.0

        Case LONG(opstruct#,22) <> 0:External("Shell32","SHFreeNameMappings",LONG(opstruct#,22))'min XP

    endif

    Dispose file#,file2#,opstruct#,title#

EndProc

cls
SHFileoperation("Delete","c:\\Temp\\Test\\","",1,1,0)
print "fertig"
Waitinput
end
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
26.07.2011  
 



Rekursives AddFiles per XProfans AddFiles-Funktion oder über die AddFiles.Dll (  [...]  ) und alle gelisteten Dateien löschen und anschließend ein AddDirs (aus AddFiles.Dll) und alle Verzeichnisse entfernen. Du musst immer davon ausgehen das sich eine Datei/ Verzeichnis nicht entfernen lässt.
 
24.07.2011  
 




Julian
Schmidt
Danke IF,
mein Quelltext so funktioniert soweit, bis darauf das der Ausgangsordner selbst nicht gelöscht wird. Liegt es vlt daran das der Explorer oder ein anderer Prozess diesen blockiert. Kannst du den Quelltext testen?
delete_folder_completely("D:\Test")
Messagebox("Ordner gelöscht","INFO",64)

Proc delete_folder_completely

    Parameters Pfad$
    var addfiles.dll&=ImportDLL("addfiles.dll","")
    var h&=Create("List", 0)
    Chdir Pfad$
    AddFiles("*.*",h&,1)
    MoveListToHandle(h&)

    whileloop GetCount(h&)

        Erase GetString$(h&,&loop-1)

    Endwhile

    clearlist h&
    Chdir Pfad$
    AddDirs("*.*",h&,1)

    whileloop GetCount(h&),1,-1

        RmDir GetString$(h&,&loop-1)

    Endwhile

    destroywindow(h&)
    RmDir Pfad$
    FreeDLL addfiles.dll&

EndProc


13 kB
Hochgeladen:24.07.2011
Ladeanzahl86
Herunterladen
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
24.07.2011  
 



XProfan 11.2.1.8a.63 Praekompiler [XPSE]
Copyright (C) 1998-2010 XProfan.Com, built DE.

Datei: c:\dev\test.xprf
Warnung: Unbekannte Escapesequenz in Stringkonstante: "D:\Test"

[C]ompile [I]nterpr [L]ink [R]unPrc Run[E]xe [S]ource [H]ilfe

XPSE:>
 
24.07.2011  
 




Julian
Schmidt
iF (24.07.11)
Warnung: Unbekannte Escapesequenz in Stringkonstante: "D:\Test"


Und was soll das genau bedeuten?
Ist etwa ein Fehler im Code?
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
24.07.2011  
 




Jörg
Sellmeyer
Ist nur die Meckerei von XPSE, daß Du einfache Backslash statt doppelte verwendest.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
24.07.2011  
 




Julian
Schmidt
Na dann, bin ich beruhigt.
Dennoch ein Problem.
Warum kommt bei dem Quelltext eine Fehlermeldung?


delete_folder_completely(ChooseDir$("Verzeichnis wählen:"))
Messagebox("Ordner gelöscht","INFO",64)

Proc delete_folder_completely

    Parameters Pfad$
    var addfiles.dll&=ImportDLL("addfiles.dll","")
    var h&=Create("List", 0)
    Chdir Pfad$
    AddFiles("*.*",h&,1)
    MoveListToHandle(h&)

    whileloop GetCount(h&)

        Erase GetString$(h&,&loop-1)

    Endwhile

    clearlist h&
    Chdir Pfad$
    AddDirs("*.*",h&,1)

    whileloop GetCount(h&),1,-1

        RmDir GetString$(h&,&loop-1)

    Endwhile

    destroywindow(h&)
    RmDir Pfad$
    FreeDLL addfiles.dll&

EndProc


Ich habe nur die erste Zeile geändert!
"delete_folder_completely("D:\Test")"
zu
"delete_folder_completely(ChooseDir$("Verzeichnis wählen:"))"


Nachdem ich die Zeile wieder abändere funktioniert alle wieder wie zuvor.
Jemand eine Idee?

[OFFTOPIC]Descargar
externer Download
[/OFFTOPIC]


Nachtrag: Der Ausgangsordner wird leider immernoch nicht gelöscht, selbst wenn ich den Computer neustarte!

211 kB
Hochgeladen:24.07.2011
Ladeanzahl113
Herunterladen
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
24.07.2011  
 



@Jörg: Nicht ganz denn es hieß auch "Checkst Du halt erstmal selber bevor Du andere darum bittest z.B. ihre Festplatte zu löschen".
 
24.07.2011  
 



@Julian: Du solltest unbedingt eine chdir-Funktion herstellen die zurückliefert ob der Verzeichniswechsel erfolgreich war (z.B. per getDir$("@")) bevor Du Dateinamen sammelst von Dateien die dann gelöscht werden (sollen). ^^
 
25.07.2011  
 




Julian
Schmidt
So was in diese Richtung?
delete_folder_completely("C:\\Test")
Messagebox("Ordner gelöscht","INFO",64)

Proc delete_folder_completely

    Parameters Pfad$
    var addfiles.dll&=ImportDLL("addfiles.dll","")
    var h&=Create("List", 0)
    Chdir Pfad$
    case @GetDir$("@")=Pfad$ : AddFiles("*.*",h&,1)
    MoveListToHandle(h&)

    whileloop GetCount(h&)

        Erase GetString$(h&,&loop-1)

    Endwhile

    clearlist h&
    Chdir Pfad$
    case @GetDir$("@")=Pfad$ :  AddDirs("*.*",h&,1)

    whileloop GetCount(h&),1,-1

        RmDir GetString$(h&,&loop-1)

    Endwhile

    destroywindow(h&)
    case @GetDir$("@")=Pfad$ : RmDir Pfad$
    FreeDLL addfiles.dll&

EndProc


Julian57 (24.07.11)
Dennoch ein Problem.
Warum kommt bei dem Quelltext eine Fehlermeldung?


delete_folder_completely(ChooseDir$("Verzeichnis wählen:"))
Messagebox("Ordner gelöscht","INFO",64)

Proc delete_folder_completely

    Parameters Pfad$
    var addfiles.dll&=ImportDLL("addfiles.dll","")
    var h&=Create("List", 0)
    Chdir Pfad$
    AddFiles("*.*",h&,1)
    MoveListToHandle(h&)

    whileloop GetCount(h&)

        Erase GetString$(h&,&loop-1)

    Endwhile

    clearlist h&
    Chdir Pfad$
    AddDirs("*.*",h&,1)

    whileloop GetCount(h&),1,-1

        RmDir GetString$(h&,&loop-1)

    Endwhile

    destroywindow(h&)
    RmDir Pfad$
    FreeDLL addfiles.dll&

EndProc


Ich habe nur die erste Zeile geändert!
"delete_folder_completely("D:\Test")"
zu
"delete_folder_completely(ChooseDir$("Verzeichnis wählen:"))"


Nachdem ich die Zeile wieder abändere funktioniert alle wieder wie zuvor.
Jemand eine Idee?

[OFFTOPIC]Descargar
externer Download
[/OFFTOPIC]


Nachtrag: Der Ausgangsordner wird leider immernoch nicht gelöscht (vollständig geleert, aber nicht mehr), selbst wenn ich den Computer Neustarte!
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
25.07.2011  
 




ByteAttack
Schon mal mit deltree probiert?
 
Website:  [...] 
Facebook:  [...] 
25.07.2011  
 




Thomas
Freier
Also, wenn's der Papierkorb sein darf, und nicht absolut restlos sein soll, ist bei Erase auch nicht der Fall :
'aus der MMJ-Quellcodesammlung (Dietmar Horn)
'Datei in den Papierkorb verschieben
'Lauffähig ab Profan-Version 5.0
' PRFellow-Vorlage
' Autor: Thomas Hölzer
' Eine Datei in den Papierkorb verschieben (ab Profan 5.0-32)
' Parameter:
' (1): Voller Pfadname
' (2): 1, wenn Bestätigungs-Dialog angezeigt werden soll
' Eine Rückgabe <> 0 markiert einen Fehler oder User-Abbruch
Def SHFileOperation(1) !"SHELL32","SHFileOperationA"
Declare SHFO#
Declare file#

Proc MoveFileToBin

    Parameters file$,confirm%
    Declare flags%, result&
    FindFirst$(file$)
    Case %IOResult: Return -1
    Let flags%=64
    Case confirm%: flags%=80
    Dim SHFO#,30
    Dim file#,Len(file$)+2
    String file#,0=file$
    Long SHFO#,0=GetActiveWindow()
    Long SHFO#,4=3
    Long SHFO#,8=file#
    Long SHFO#,12=0
    Word SHFO#,16=flags%
    Long SHFO#,18=0
    Long SHFO#,22=0
    Long SHFO#,26=0
    result&=SHFileOperation(SHFO#)
    Dispose file#
    Dispose SHFO#
    Return result&

EndProc

' Beispiel
Cls
print MoveFileToBin("C:\\TEST\\Test.txt",1)' nur mal so
print MoveFileToBin("C:\\TEST",1)
waitinput
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.07.2011  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

30.834 Betrachtungen

Unbenanntvor 0 min.
E.T.22.11.2023
Georg21.01.2021
AndreasS23.12.2018
Klaus Ernst09.01.2018
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie