Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0323: Den Shell-Dialog zum Löschen nutzen

 von 

Beschreibung 

Die Windows Shell bietet den allseits bekannten Dialog zur freien Verwendung an. Er lässt sich daher natürlich auch unter VB nutzen. Dabei können einige Flags gesetzt werden um das Vorgehen recht komfortabel zu parametrieren. Dieses Beispiel zeigt das Löschen von Dateien mit Hilfe dieses Dialogs.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

SHFileOperationA (SHFileOperation)

Download:

Download des Beispielprojektes [2,9 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Kontrollkästchen-Steuerelement "Check5"
' Steuerelement: Kontrollkästchen-Steuerelement "Check4"
' Steuerelement: Kontrollkästchen-Steuerelement "Check3"
' Steuerelement: Kontrollkästchen-Steuerelement "Check2"
' Steuerelement: Verzeichnisauswahlliste "Dir1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Dateiauswahlliste "File1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Kontrollkästchen-Steuerelement "Check1"

Option Explicit

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

Private Type SHFILEOPSTRUCT
  Hwnd As Long
  wFunc As Long
  pFrom As String
  pTo As String
  fFlags As Integer
  fAnyOperationsAborted As Boolean
  hNameMappings As Long
  lpszProgressTitle As String
End Type

Const FO_MOVE = &H1
Const FO_COPY = &H2
Const FO_DELETE = &H3
Const FO_RENAME = &H4

Const FOF_MULTIDESTFILES = &H1
Const FOF_CONFIRMMOUSE = &H2
Const FOF_SILENT = &H4
Const FOF_RENAMEONCOLLISION = &H8
Const FOF_NOCONFIRMATION = &H10
Const FOF_WANTMAPPINGHANDLE = &H20
Const FOF_ALLOWUNDO = &H40
Const FOF_FILESONLY = &H80
Const FOF_SIMPLEPROGRESS = &H100
Const FOF_NOCONFIRMMKDIR = &H200

Private Sub Command1_Click()
  Call MakeFiles
End Sub

Private Sub Command2_Click()
  Dim Files$
  Dim SFO As SHFILEOPSTRUCT
    
    MousePointer = vbHourglass
    
    Command1.Enabled = False
    Command2.Enabled = False
    DoEvents
    
    Files = Files & App.Path & "\Test\*.*" & Chr$(0)
    Files = Files & Chr$(0)
    
    With SFO
      .Hwnd = Me.Hwnd
      .wFunc = FO_DELETE
      .pFrom = Files
      .pTo = "" & Chr$(0)
      
      'keine Unterverzeichnisse
      If Check1.Value = vbUnchecked Then .fFlags = FOF_FILESONLY
      
      'Fortschritt anzeigen
      If Check2.Value = vbChecked Then _
                        .fFlags = .fFlags Or FOF_SIMPLEPROGRESS
      
      'Dialog anzeigen
      If Check3.Value = vbChecked Then _
                        .fFlags = .fFlags Or FOF_NOCONFIRMATION
      
      'Nur Bestätigungsdialog zum Löschen
      If Check4.Value = vbChecked Then _
                        .fFlags = .fFlags Or FOF_SILENT
      
      'In den Papierkorb statt löschen
      If Check5.Value = vbChecked Then _
                        .fFlags = .fFlags Or FOF_ALLOWUNDO
    End With

    Call SHFileOperation(SFO)
    File1.Refresh
    If Check1.Value = vbChecked Then
      Dir1.Path = App.Path & "\Test"
      Dir1.Refresh
    End If
    
    If SFO.fAnyOperationsAborted Then
      Call MsgBox("Enige Operationen wurden nicht ausgeführt!")
    End If
    
    MousePointer = vbDefault
    Command1.Enabled = True
End Sub

Private Sub MakeFiles()
  Dim x&, y&, FN%, aa$, bb$
    
    Command1.Enabled = False
    Command2.Enabled = False
    DoEvents
    
    MousePointer = vbHourglass
    
    'Ein paar Ordner und Dateien erstellen
    bb = App.Path & "\Test"
    If Len(Dir$(bb, vbDirectory)) = 0 Then
      MkDir bb
    End If
    
    aa = String(1024, "x")
    For y = 0 To 500
      FN = FreeFile
      Open bb & "\File" & CStr(y) & ".txt" For Output As #FN
        Print #FN, aa
      Close FN
    Next y
    
    If Dir$(bb & "\Ordner1", vbDirectory) = "" Then
      MkDir bb & "\Ordner1"
    End If
    
    If Dir$(bb & "\Ordner1\Ordner2", vbDirectory) = "" Then
      MkDir bb & "\Ordner1\Ordner2"
    End If

    File1.Path = bb
    File1.Refresh
    
    Dir1.Path = bb & "\Ordner1\Ordner2"
    Dir1.Refresh
    
    MousePointer = vbDefault
    Command2.Enabled = True
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 1 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von horst am 05.12.2003 um 15:05

Ich möchte ein Dialogfenster einblenden, wenn eine/mehrere der zu löschenden Dateien geöffnet ist (z.B. mit Editor), damit der Nutzer vor dem Löschen noch die Chance hat, das, was er bearbeitet hat noch anderweitig abzuspeichern.
Kann man einen solchen Dialog einfach in diesen Code einbinden?
Wenn ja, wäre es schön zu erfahren: Wie?
Danke schon mal für die Hilfe.
horst