Zufälliger Artikel

 Problemstellung:

Manchmal ist es erforderlich alte Dateien zu löschen, egal ob es alte Import-, Sicherungsdateien o.ä. sind.
Jetzt möchte man aber die zu löschenden Dateien einschränken, ob nun nach Dateinamen und/oder Dateidatum,
mit Unterverzeichnissen oder ohne.

Für dieses Problem möchte ich hier eine Lösung vorstellen.

Es ist eine Mischung aus FileSystemObject(FSO)- und API-Funktionen.

1. API-Aufrufe zum Löschen der Dateien

Hier kommt die API-Funktion "SHFileOperation" zum Einsatz

1.1. Declare- und Konstantendeklaration

Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" ( _
ByRef 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 Long
   hNameMappings As Long
   lpszProgressTitle As String
End Type
Private Const FO_DELETE = &H3&
Private Const FOF_ALLOWUNDO = &H40&
Private Const FOF_NOCONFIRMATION = &H10

Wobei die Konstante

Private Const FOF_ALLOWUNDO = &H40&

dafür zuständig ist das die gelöschten Dateien im Papierkorb landen

und die Konstante

Private Const FOF_NOCONFIRMATION = &H10&

die Bestätigung jeder Dateilöschung deaktiviert.

Dies rufen wir dann in dieser Sub auf:

1.2. Dateien in den Papierkorb löschen

Private Sub Delete_to_Trash(sFilename As String)
   Dim udtFileStructure As SHFILEOPSTRUCT
   With udtFileStructure
     .wFunc = FO_DELETE
     .pFrom = sFilename
     .fFlags = FOF_ALLOWUNDO Or FOF_NOCONFIRMATION
   End With
   SHFileOperation udtFileStructure
End Sub

2. Lesen der Dateien mit FSO, prüfen der Kriterien und löschen der Dateien

Die folgende Sub macht dann die eigentliche Arbeit

Public Sub DeleteCriteriaFiles(sPath As String, Optional sCriteria As String = "*.*", _
                               Optional dtCriteriaDate As String = "", _
                               Optional bSubFolder As Boolean = False)
    Dim oFSO As New FileSystemObject
    Dim oFolder As Folder
    Dim oSubFolders As Object, oSubFolder As Folder
    Dim oFile As File
    Set oFolder = oFSO.GetFolder(sPath)
    For Each oFile In oFolder.Files
        If oFile.Name Like sCriteria = True Then
            If dtCriteriaDate <> "" Then
                'Datumskriterium vorhanden
                If CDate(Left(oFile.DateLastModified, 10)) <= CDate(dtCriteriaDate) Then Delete_to_Trash oFile.Path
            Else
                'Datumskriterium nicht vorhanden
                Delete_to_Trash oFile.Path
            End If
        End If
    Next oFile
    'Unterverzeichnisse einbeziehen
    If bSubFolder = True Then
        Set oSubFolders = oFolder.SubFolders
        For Each oSubFolder In oSubFolders
            DeleteCriteriaFiles oSubFolder.Path, sCriteria, dtCriteriaDate, bSubFolder
        Next oSubFolder
    End If
    Set oFile = Nothing: Set oSubFolders = Nothing
    Set oFolder = Nothing: Set oSubFolder = Nothing
    Set oFSO = Nothing
End Sub

Folgende Parameter werden der Prozedur übergeben:

sPath As String

Der komplette Pfad des betreffenden Verzeichnisses mit abschliessenden Backslash

Optional sCriteria As String = "*.*" 

Das Filterkriterium für die Dateinamen, Standard = Alle (*.*)

Optional dtCriteriaDate As String = "" 

Das Filterkriterium für das Dateidatum Standard = Kein ("")
Bei einer Angabe eines Datums werden alle Dateien deren letztes Änderungsdatum <= dem Kriterium entspricht gelöscht.
Wird etwas anderes gewünscht muss diese Zeile angepasst werden:

If CDate(Left(oFile.DateLastModified, 10)) <= CDate(dtCriteriaDate) Then Delete_to_Trash oFile.Path
Optional bSubFolder As Boolean = False

Sollen Unterverzeichnisse einbezogen werden? Standard = Nein (False)
 
Der Aufruf z.B.:

DeleteCriteriaFiles "D:\users\Test0\", "*.txt", "01.09.2010", True 
 
Würde aus dem Verzeichnis "D:\Users\Test0", mit Unterverzeichnissen, alle txt-Dateien löschen deren letztes Änderungsdatum
kleiner gleich dem 01.09.2010 ist.
 

Ähnliche Artikel

Home

1 1 1 1 1 1 1 1 1 1 Rating 4.33 (3 Votes)

Problemstellung:
Wie kann ich die Mehrfachauswahl eines Listenfeldes speichern?

Lösung:
Als Bsp. habe ich mal Lehrer gewählt.
Im Listenfeld werden die verfügbaren Fächer angezeigt.
Jetzt kann man in dem Listenfeld alle Fächer auswählen die derjeweilige Lehrer unterrichtet.
Mit einem Klick auf den Button werden die gewählten Fächer in der DB gespeichert.
Die Anzeige im Form im unteren Feld (rot umrandet) ist nur zu Demozwecken.

 
 
Beim Anzeigen werden die Werte aus dem entsprechenden Feld gelesen und
automatisch wieder im Listenfeld markiert.

Und wie geht das nun? Seht Euch die Bsp-DB an.
 

Dateien:

Mehrfachauswahl eines Listenfeldes speichern

ab A00

Die Zip-Datei enthält ein Version ab A00

Datum 05.02.2018
Dateigröße 20.73 KB
Download 1.336

Ähnliche Artikel

Kommentar schreiben

Sicherheitscode
Aktualisieren

Login Form

1.png1.png9.png8.png5.png9.png3.png
Heute47
Gestern110
Diese Woche585
Dieser Monat2247
Total1198593

  • IP: 54.224.60.122
  • Browser: Unknown
  • Version:
  • OS: Unknown

Online

3
Online

21. Juli 2018

Letzte Kommentare

  • Trusted Locations Manager

    Tommy Admin 13.07.2018 13:06
    RE: Trusted Locations Manager
    Hallo Matthias, aus Ermangelung einer 64bit Version kann ich das leider nicht prüfen. Tut mir leid. Gruss ...

    Weiterlesen...

     
  • Trusted Locations Manager

    Matthias 13.07.2018 06:48
    Funktioniert nicht
    Habe gerade den TL-Manager installiert. Nach dem Start sagt er mir, dass es kein Office erkennen ...

    Weiterlesen...