PDA

Vollständige Version anzeigen : Wie löscht man Verzeichnissbäume?


andread
30.06.2001, 20:33
Hallo,
habe schon viel von euch gelernt!
aber wie löscht man verzeichnissbäume?

Es soll das Verzeichniss aus einem Feld vorgegeben werden.
Dann soll mit der windows eigenen animation (fliegende ordner) das zeugs gelöscht werden!

Wer kan mir sagen wie man soetwas programmiert bzw. hat ein Beispiel für mich?

grüsse und danke in vorraus

Andrea

Stefan Kulpa
01.07.2001, 03:34
<font face="Verdana" size="2">Hallo,

wenn's mit den "flying windows" sein soll, geht's nur mittels API:</font>

<FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Option</FONT> <FONT COLOR=#000080>Explicit</FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Type</FONT> SHFILEOPSTRUCT
hwnd <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
wFunc <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
pFrom <FONT COLOR=#000080>As String</FONT>
pTo <FONT COLOR=#000080>As String</FONT>
fFlags <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Integer</FONT>
fAborted <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
hNameMaps <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
sProgress <FONT COLOR=#000080>As String</FONT>
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Type</FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> GetDesktopWindow <FONT COLOR=#000080>Lib</FONT> "user32" () <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Declare</FONT> <FONT COLOR=#000080>Function</FONT> SHFileOperation <FONT COLOR=#000080>Lib</FONT> "shell32.dll" <FONT COLOR=#000080>Alias</FONT> _
"SHFileOperationA" (lpFileOp <FONT COLOR=#000080>As</FONT> SHFILEOPSTRUCT) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT>
<FONT COLOR=#808080><HR></FONT>

<FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Function</FONT> DelTree(<FONT COLOR=#000080>ByVal</FONT> sParentFolder <FONT COLOR=#000080>As String</FONT>, <FONT COLOR=#000080>Optional</FONT> bAllowUndo <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Boolean</FONT> = <FONT COLOR=#000080>True</FONT>) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Boolean</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Methode: | Löscht einen Verzeichnisbaum</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Parameter: | sParentFolder - Ausgangsordner</FONT>
<FONT COLOR=#008000>'// | bAllowUndo (optional) - in den Papierkorb verschieben</FONT>
<FONT COLOR=#008000>'// | oder direkt löschen</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Rückgabe: | True bei Erfolg</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#000080>Const</FONT> FO_DELETE <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT> = &H3
<FONT COLOR=#000080>Const</FONT> FOF_ALLOWUNDO <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT> = &H40

<FONT COLOR=#000080>Dim</FONT> uSHFileOp <FONT COLOR=#000080>As</FONT> SHFILEOPSTRUCT
<FONT COLOR=#000080>On Error Resume Next</FONT>
<FONT COLOR=#000080>With</FONT> uSHFileOp
.hwnd = GetDesktopWindow()
.wFunc = FO_DELETE
.pFrom = sParentFolder & vbNullChar
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#000080>If</FONT> bAllowUndo <FONT COLOR=#000080>Then</FONT> uSHFileOp.fFlags = FOF_ALLOWUNDO
DelTree = (SHFileOperation(uSHFileOp) = 0)

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Function</FONT>

</FONT>

<font face="Verdana" size="2">Kopiere diesen Code in ein Modul und rufe die Funktion DelTree mit Übergabe des zu löschenden Ordners auf.

HTH</font>

andread
01.07.2001, 08:21
Hi stefan,

schönen dank für deine schnelle Antwort bzw. Hilfe.

Habe es noch nicht installiert, gehe aber davon aus das gehen wird.
Du hast mir schon mal geholfen, da gings auch um api-filemanagment, und das hat auch auf anhieb funktioniert.

Danke herzlichst
Andrea

andread
01.07.2001, 13:19
Hi Stefan,

es klappt, super danke!

möchte aber noch etwas verändern!
Es erscheint immer dieses Ja/mein Fenster willst du wirklich löschen!
auch wenn ich hier dann nein klicke erhalte ich als antwort TRUE was ich auch bekomme wenn das löschen erfolgreich war!

Entweder ich verhindere jetzt das erscheinen diese ja/nein windows, was mir am liebsten wäre, denn ich habe in acces schon zweimal geschekt ob ich wirklich löschen will, oder ich krieg irgendwie was anderes zurück als true oder false wenn ich nein klicke!

das ja nein window muss doch irgendwie über die api funktionalität zu steuern sein, oder?
was haben diese ganzen parameter die hier gleich folgen für einen sinn?

Public Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Long
hNameMaps As Long
sProgress As String
End Type

With uSHFileOp
.hwnd = GetDesktopWindow()
.wFunc = FO_DELETE
.pFrom = sParentFolder & vbNullChar
End With
If bAllowUndo Then uSHFileOp.fFlags = FOF_ALLOWUNDO
DelTree = (SHFileOperation(uSHFileOp) = 0)

Wo kann man näheres dazu nachlesen, am besten in deutsch? einer muss doch für diese ja/nein fenster sein oder?

grüsse
andrea

Stefan Kulpa
01.07.2001, 15:55
<font face="Verdana" size="2">Hallo Andrea,

eine genaue Erläuterung der Struktur SHFILEOPSTRUCT und den möglichen Werten findest Du <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/Structures/SHFILEOPSTRUCT.asp" target="_blank">hier</a> - leider nur in Englisch; auf die Schnelle konnte ich keine deutsche Variante auftreiben.

Um die Abfrage (ja/nein) auszuschalten, muss eine weitere Konstante benutzt werden (s. Beispiel) - es gibt zwar eine Strukturvariable fAborted, die allerdings nicht den Abbruch des Dialogs (sprich: Nein-Taste) berücksichtigt, sondern den Abbruch während des Vorgangs ... die Auswahl Ja/Nein wird wohl nur über SubClassing des Dialogs funktionieren (das macht's aber erst recht kompliziert).

Hier ein modifiziertes Beispiel, um zumindest die Nachfrage auszuschalten:</font>

<FONT SIZE=1 FACE=Courier New><FONT COLOR=#000080>Public</FONT> <FONT COLOR=#000080>Function</FONT> DelTree(<FONT COLOR=#000080>ByVal</FONT> sParentFolder <FONT COLOR=#000080>As String</FONT>, _
<FONT COLOR=#000080>Optional</FONT> bAllowUndo <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Boolean</FONT> = <FONT COLOR=#000080>True</FONT>) <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Boolean</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Methode: | Löscht einen Verzeichnisbaum</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Parameter: | sParentFolder - Ausgangsordner</FONT>
<FONT COLOR=#008000>'// | bAllowUndo (optional) - in den Papierkorb verschieben</FONT>
<FONT COLOR=#008000>'// | oder direkt löschen</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#008000>'// Rückgabe: | True bei Erfolg</FONT>
<FONT COLOR=#008000>'// -----------------------------------------------------------------</FONT>
<FONT COLOR=#000080>Const</FONT> FO_DELETE <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT> = &H3
<FONT COLOR=#000080>Const</FONT> FOF_ALLOWUNDO <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT> = &H40
<FONT COLOR=#000080>Const</FONT> FOF_NOCONFIRMATION <FONT COLOR=#000080>As</FONT> <FONT COLOR=#000080>Long</FONT> = &H10
<FONT COLOR=#000080>Dim</FONT> uSHFileOp <FONT COLOR=#000080>As</FONT> SHFILEOPSTRUCT
<FONT COLOR=#000080>With</FONT> uSHFileOp
.hwnd = GetDesktopWindow()
.wFunc = FO_DELETE
.pFrom = sParentFolder & vbNullChar
<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>With</FONT>
<FONT COLOR=#000080>If</FONT> bAllowUndo <FONT COLOR=#000080>Then</FONT> uSHFileOp.fFlags = FOF_ALLOWUNDO
<FONT COLOR=#008000>'** Ohne Rückfrage durchführen ------------------------------</FONT>
uSHFileOp.fFlags = uSHFileOp.fFlags <FONT COLOR=#000080>Or</FONT> FOF_NOCONFIRMATION
DelTree = (SHFileOperation(uSHFileOp) = 0)
<FONT COLOR=#008000>'** Abbruch während des Vorgangs berücksichtigen ------------</FONT>
DelTree = DelTree <FONT COLOR=#000080>And</FONT> (uSHFileOp.fAborted = <FONT COLOR=#000080>False</FONT>)

<FONT COLOR=#000080>End</FONT> <FONT COLOR=#000080>Function</FONT>

</FONT>

<font face="Verdana" size="2">Die API-Funktion gibt 0 zurück, wenn der Vorgang ohne Abbruch geklappt hat aber auch dann, wenn der Benutzer auf die Schaltfläche Nein geklickt hat... (Nein <> Abbruch).

Gruß</font>

<hr><font face="Verdana" size="2"><font color="#008000"><a href="http://vbtipps.gmxhome.de/MyLinks.html" target="_blank">Hier könnte man auch was finden ...</a></font></font>

andread
02.07.2001, 10:47
Hallo Stefan,
ich weis ich nerve aber ...

mein Modul sieht jetzt so aus!

Option Compare Database

Public Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Long
hNameMaps As Long
sProgress As String
End Type

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function SHFileOperation Lib "shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long



Public Function DelTree(ByVal sParentFolder As String, Optional bAllowUndo As Boolean = True) As Boolean
'// -----------------------------------------------------------------
'// Methode: | Löscht einen Verzeichnisbaum
'// -----------------------------------------------------------------
'// Parameter: | sParentFolder - Ausgangsordner
'// | bAllowUndo (optional) - in den Papierkorb verschieben
'// | oder direkt löschen
'// -----------------------------------------------------------------
'// Rückgabe: | True bei Erfolg
'// -----------------------------------------------------------------
Const FO_DELETE As Long = &H3
Const FOF_ALLOWUNDO As Long = &H40
Const FOF_NOCONFIRMATION As Long = &H10
Dim uSHFileOp As SHFILEOPSTRUCT
On Error Resume Next

With uSHFileOp
.hwnd = GetDesktopWindow()
.wFunc = FO_DELETE
.pFrom = sParentFolder & vbNullChar
End With
If bAllowUndo Then uSHFileOp.fFlags = FOF_ALLOWUNDO
'** Ohne Rückfrage durchführen ------einklammern wenn mit Rückfrage gelöscht werden soll
uSHFileOp.fFlags = uSHFileOp.fFlags Or FOF_NOCONFIRMATION
'** Abbruch während des Vorgangs nicht berücksichtigen ------------einklammern wenn Abbruch möglich sein soll
' DelTree = (SHFileOperation(uSHFileOp) = 0)
'** Abbruch während des Vorgangs berücksichtigen ------------
DelTree = DelTree And (uSHFileOp.fAborted = False)

End Function


Die Variante in der das Abrechen während des löschens noch möglich sein soll funktioniert bei mir nicht!
Die Ja/nein Abfrage ob wirklich gelöscht werden soll ist wunschgemäss verschwunden.

Was brennt jetzt noch im Busch?

Gruss Andrea

Stefan Kulpa
02.07.2001, 17:08
<font face="Verdana" size="2">Hallo Andrea,

der Dialog (flying windows) taucht nicht immer auf - erst wenn's "mal wieder" länger dauert ...
wann genau das ist, weiß wohl nur Microsoft. Taucht er denn mal auf, dann sollte man auch abbrechen können.
Nimm einfach mal ein recht großes "Testverzeichnis", bei dem das Löschen etwas länger dauert, dann müßte auch der Dialog auftauchen.

Gruß, Stefan</font>

andread
02.07.2001, 18:34
Sorry Stefan,

hier habe ich mich wohl falsch ausgedrückt!

Es funtioniert bei der Variante ohne das man Abbrechen als möglichkeit hat!
DelTree = (SHFileOperation(uSHFileOp) = 0)


Es funktioniert nicht bei der geposteten Version.
DelTree = DelTree And (uSHFileOp.fAborted = False)


Ich meine, das bei dem geposteten Modul irgendwo ein Fehler ist! Ich bekomme definitiv eine Fehlermeldung . Trotz error.discription ist die msgbox aber ohne hinweis text!

Ich habe es mit einem grossen Verzeichnis probiert!

Gruss Andrea