| |
|
|
- 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. |
|
|
| |
|
|
|
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
|
|
|
| ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ 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:> |
|
|
| |
|
|
|
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?
Nachtrag: Der Ausgangsordner wird leider immernoch nicht gelöscht, selbst wenn ich den Computer neustarte! |
|
|
| ˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗ 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". |
|
|
| |
|
|
|
| @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). ^^ |
|
|
| |
|
|
|
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? 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? |
|
|
| |
|
|
|
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
|
|
|
| |
|
|