Italia
Foro

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

 
- Page 1 -



Julian
Schmidt
Wie kann man ein Verzeichnis am elegantesten mit allen Unterverzeichnissen und allem enthaltenen File 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 per 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 File, 1 = Kopie der File 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 File per 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 per 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 circa die AddFiles.Dll (  [...]  ) und alle gelisteten File löschen und anschließend ein AddDirs (aus AddFiles.Dll) und alle Verzeichnisse entfernen. Du musst immer davon ausgehen das sich eine File/ 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
Downloadcounter86
Download
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
24.07.2011  
 



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

File: 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 Io l' Computer neustarte!

211 kB
Hochgeladen:24.07.2011
Downloadcounter114
Download
 
˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
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 File 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 Io l' 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)
'File in den Papierkorb verschieben
'Lauffähig ab Profan-Version 5.0
' PRFellow-Vorlage
' Autor: Thomas Hölzer
' Eine File 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  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

30.953 Views

Untitledvor 0 min.
E.T.22.11.2023
Georg21.01.2021
AndreasS23.12.2018
Klaus Ernst09.01.2018
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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