💥 Eine große Sammlung von Funktionen rund um Dateien und Ordner


️ Worum geht es?

Wenn du mit VBA und Access arbeitest, kennst du das: Dateien lesen und schreiben, Ordner anlegen, kopieren, verschieben, prüfen ob etwas existiert oder beschreibbar ist - immer wieder aufs Neue. Dieses Modul bündelt all diese Aufgaben in klar benannten, einheitlichen Funktionen, die sich elegant kombinieren lassen.


🤴🏼 Was macht sie besonders?

Ein durchgängiges Namens- und Rückgabeschema (File* / Folder* / Path*), reines Late-Binding (keine Verweise nötig, 32- und 64-Bit-fähig), stilles Fehlerverhalten (Funktionen liefern nur einen definierten Fehlerwert statt Dialoge) und UTF-8-fähiges Lesen und Schreiben. Jede Funktion ist kommentiert und prüft ihre Eingaben.


💡 Rückgabe- und Fehlerkonvention

Aktionen (Create/Write/Delete/Copy/Move) liefern Boolean (Fehler = False). String-Abfragen liefern "" bei Fehler, Zahl-Abfragen -1, Listen ein leeres Array. Fehler sind standardmäßig still; mit FilesFolderVerbose True werden echte Fehler über die zentrale ErrBox angezeigt.


📜 Alle Funktionen im Überblick

🔵 Gruppe A - Pfad-Zerlegung (reiner String, kein Plattenzugriff)

✅  FileName  -   Dateiname inklusive Endung, z. B. "report.txt".
 FileName(sPath) → String

✅   FileBaseName  -  Dateiname ohne Endung, z. B. "report".
 FileBaseName(sPath) → String

✅   FileSuffix  -  Endung in Kleinbuchstaben, ohne Punkt, z. B. "txt".
 FileSuffix(sPath) → String

✅   FileFolder  -  Übergeordneter Ordner, ohne abschließenden Backslash.
 FileFolder(sPath) → String

✅   FileExtChange  -  Endung tauschen, z. B. report.txt wird zu report.pdf.
 FileExtChange(sPath, sNewExt) → String

✅   PathCombine  -  Ordner und Name mit genau einem Backslash verbinden.
 PathCombine(sFolder, sName) → String

✅  PathDrive  -   Laufwerk ("C:") oder UNC-Wurzel (\\server\share).
 PathDrive(sPath) → String

✅   PathIsAbsolute  -  Ist der Pfad absolut (Laufwerk oder UNC)?
 PathIsAbsolute(sPath) → Boolean

✅   PathNormalize  -  Bereinigt Trenner, doppelte Backslashes und löst . und .. auf.
 PathNormalize(sPath) → String


🔵 Gruppe B - Datei-Operationen (Plattenzugriff)

✅   FileExists  -  Prüft, ob eine Datei vorhanden ist.
 FileExists(sPath) → Boolean

✅  FileCreate  -  Legt eine leere Datei an.
 FileCreate(sPath, [bolOverwrite=False]) → Boolean

✅  FileRead  -   Liest den gesamten Inhalt einer Textdatei.
 FileRead(sPath, [sCharset="UTF-8"]) → String

✅   FileReadLines  -  Liest die Datei als Array einzelner Zeilen.
 FileReadLines(sPath, [sCharset="UTF-8"]) → Variant

✅  FileWrite  -   Schreibt Text (UTF-8 mit BOM).
 FileWrite(sPath, sContent, [bolOverwrite=True], [sCharset="UTF-8"]) → Boolean

✅   FileWriteUtf8  -  Schreibt UTF-8, BOM optional (Standard ohne BOM) - ideal für sauberes HTML.
 FileWriteUtf8(sPath, sContent, [bolBom=False], [bolOverwrite=True]) → Boolean

✅   FileWriteLines  -  Schreibt ein Array zeilenweise (Gegenstück zu FileReadLines).
 FileWriteLines(sPath, vLines, [bolOverwrite=True], [sCharset="UTF-8"]) → Boolean

✅   FileAppend  -  Hängt Text encoding-sicher an eine Datei an.
 FileAppend(sPath, sContent, [sCharset="UTF-8"]) → Boolean

✅   FileDelete  -  Löscht eine Datei endgültig (am Papierkorb vorbei).
 FileDelete(sPath) → Boolean

✅  FileCopy  -   Kopiert eine Datei.
 FileCopy(sSource, sDest, [bolOverwrite=False]) → Boolean

✅  FileMove  -   Verschiebt oder benennt eine Datei um.
 FileMove(sSource, sDest) → Boolean

✅  FileSize  -  Größe in Bytes (über 2 GB liefert -1).
 FileSize(sPath) → Long

✅  FileDateModified  -   Datum "zuletzt geändert".
 FileDateModified(sPath) → Date

✅   FileCanRead  -  Echter Lesetest (öffnet die Datei kurz zum Lesen).
 FileCanRead(sPath) → Boolean

✅   FileCanWrite  -  Echter Schreibtest (öffnet mit Schreibzugriff, ohne den Inhalt zu ändern).
 FileCanWrite(sPath) → Boolean

✅  FileSetReadOnly  -   Setzt oder entfernt das ReadOnly-Attribut.
 FileSetReadOnly(sPath, bolReadOnly) → Boolean

✅   FileBackup  -  Legt eine zeitgestempelte Sicherungskopie an und liefert deren Pfad.
 FileBackup(sPath) → String

✅  FileTrash  -   Verschiebt eine Datei ohne Rückfrage in den Papierkorb (SHFileOperation).
 FileTrash(sPath) → Boolean

✅   FileIsLocked  -  Ist die Datei von einem anderen Prozess gesperrt?
 FileIsLocked(sPath) → Boolean

✅  FileWait  -   Wartet bis die Datei existiert und entsperrt ist (mit Timeout).
 FileWait(sPath, [lngTimeoutMs=5000], [bolUntilUnlocked=True]) → Boolean

✅  FileTouch  -  Legt die Datei an oder aktualisiert nur ihr Änderungsdatum (inhaltserhaltend).
 FileTouch(sPath) → Boolean

✅   FileLineCount  -  Zählt die Zeilen einer Textdatei.
 FileLineCount(sPath) → Long

✅   FilesEqual  -  Vergleicht zwei Dateien (Größe, dann Byte für Byte).
 FilesEqual(sPathA, sPathB) → Boolean

✅   FileReplaceInText  -  Ersetzt Text in einer Datei (lesen, ersetzen, schreiben).
 FileReplaceInText(sPath, sOld, sNew) → Boolean

✅  FileSizeFormat  -   Formatiert Bytes lesbar, z. B. "1,4 MB".
 FileSizeFormat(dblBytes, [iDecimals=1]) → String

✅  LogWrite  -  Hängt eine Logzeile an: Zeitstempel + Level + Nachricht - als ausgerichteter Text oder (bolCsv=True) als CSV mit Semikolon.
 LogWrite(sPath, sMessage, [eLevel=logINFO], [bolCsv=False]) → Boolean


🔵 Gruppe C - Ordner-Operationen (Plattenzugriff)

✅   FolderExists  -  Prüft, ob ein Ordner vorhanden ist.
 FolderExists(sPath) → Boolean

✅   FolderCreate  -  Legt einen Ordner an, inklusive fehlender Zwischenordner (rekursiv).
 FolderCreate(sPath) → Boolean

✅   FolderRead  -  Liste der Dateien (optional rekursiv), als volle Pfade.
 FolderRead(sPath, [sPattern="*"], [bolSubfolders=False]) → Variant

✅   FolderSubfolders  -  Liste der direkten Unterordner.
 FolderSubfolders(sPath) → Variant

✅   FolderCount  -  Anzahl der Dateien in der obersten Ebene.
 FolderCount(sPath, [sPattern="*"]) → Long

✅   FolderSubfolderCount  -  Anzahl der direkten Unterordner.
 FolderSubfolderCount(sPath) → Long

✅   FolderDelete  -  Löscht einen Ordner endgültig (ohne Recursive nur, wenn er leer ist).
 FolderDelete(sPath, [bolRecursive=False]) → Boolean

✅   FolderTrash  -  Verschiebt einen Ordner samt Inhalt ohne Rückfrage in den Papierkorb.
 FolderTrash(sPath) → Boolean

✅   FolderEmpty  -  Löscht den gesamten Inhalt, behält aber den Ordner selbst.
 FolderEmpty(sPath) → Boolean

✅   FolderSize  -  Gesamtgröße in Bytes inklusive Unterordner.
 FolderSize(sPath) → Long

✅   FolderDateModified  -  Datum "zuletzt geändert" des Ordners.
 FolderDateModified(sPath) → Date

✅  FolderCanRead  -   Echter Lesetest (enumeriert den Ordner).
 FolderCanRead(sPath) → Boolean

✅   FolderCanWrite  -  Echter Schreibtest (legt eine Testdatei an und löscht sie wieder).
 FolderCanWrite(sPath) → Boolean

✅   FolderCopy  -  Kopiert einen Ordner samt Inhalt.
 FolderCopy(sSource, sDest, [bolOverwrite=False]) → Boolean

✅   FolderMove  -  Verschiebt oder benennt einen Ordner um.
 FolderMove(sSource, sDest) → Boolean

✅   FolderNewestFile  -  Liefert die zuletzt geänderte Datei eines Ordners.
 FolderNewestFile(sPath, [sPattern="*"]) → String

✅  FolderZip  -   Packt den Ordnerinhalt in eine .zip-Datei (Windows-Shell).
 FolderZip(sFolder, sZip, [bolOverwrite=False]) → Boolean

✅   FolderUnzip  -  Entpackt eine .zip-Datei in einen Ordner.
 FolderUnzip(sZip, sFolder, [bolOverwrite=False]) → Boolean

✅  FolderTree  -  Ordner/Unterordner/Dateien als Baum mit Verbindungslinien (Explorer-Optik). Ausgabe als String, ins
     Direktfenster (treeDebug) oder in eine Datei (treeFile). Ordner vor Dateien, alphabetisch; Junctions werden nicht
     verfolgt.
FolderTree(sPath, [eTarget=treeString], [sFile], [bolFilesToo=True], [bolFileSize=False], [bolAscii=False], [bolSummary=False], [lngMaxDepth=0]) → String


🔵 Gruppe D - Datei UND Ordner kombiniert

✅   PathExists  -  Existiert der Pfad als Datei ODER Ordner?
 PathExists(sPath) → Boolean

✅  PathType  -   Liefert "File", "Folder" oder "".
 PathType(sPath) → String

✅  PathCopy  -   Kopiert eine Datei oder einen Ordner (je nach Typ).
 PathCopy(sSource, sDest, [bolOverwrite=False]) → Boolean

✅  PathMove  -   Verschiebt eine Datei oder einen Ordner.
 PathMove(sSource, sDest) → Boolean

✅   PathRename  -  Benennt Datei oder Ordner um (bleibt im selben Ordner).
 PathRename(sPath, sNewName) → Boolean

✅  PathTemp  -   Liefert einen eindeutigen, noch nicht existierenden Pfad im TEMP-Ordner.
 PathTemp([sSuffix=".tmp"]) → String


🔵Gruppe E - System-Integration (im Explorer / mit Standardprogramm öffnen)

✅  FileOpen  -  Öffnet eine Datei mit dem verknüpften Standardprogramm.
 FileOpen(sPath) → Boolean

✅   FolderOpen  -  Öffnet einen Ordner im Windows-Explorer.
 FolderOpen(sPath) → Boolean

✅   FileShowInFolder  -  Öffnet den Explorer mit der Datei bereits markiert.
 FileShowInFolder(sPath) → Boolean


🔵 Gruppe F - Laufwerke, Spezialordner & Dialoge

✅   DriveExists  -  Prüft, ob ein Laufwerk vorhanden ist.
 DriveExists(sDrive) → Boolean

✅  DriveFreeSpace  -   Freier Speicher in Bytes (Double wegen großer Werte).
 DriveFreeSpace(sDrive) → Double

✅   SpecialFolder  -  Bekannten Ordner per String liefern (Temp, Desktop, Documents, App ...).
 SpecialFolder(sName) → String

✅   SystemFolder  -  Bekannten Ordner per Enum eSystemFolder liefern - typsicher und umfangreicher.
 SystemFolder(eFolder) → String

✅   FilePicker  -  Zeigt einen Datei-Öffnen-Dialog und liefert die gewählte Datei.
 FilePicker([sFilter], [sTitle], [sInitialFolder]) → String

✅   FileSaveDialog  -  Zeigt den Windows-Speichern-unter-Dialog (Win32 GetSaveFileName) und liefert den Zielpfad - legt die Datei nicht an.
 FileSaveDialog([sFilter], [sTitle], [sInitialFolder], [sDefaultName], [sDefaultExt]) → String

✅   FolderPicker  -  Zeigt einen Ordner-Auswahl-Dialog und liefert den gewählten Ordner.
 FolderPicker([sTitle], [sInitialFolder]) → String


🔵 Konfiguration & zentrale Meldung

✅   FilesFolderVerbose  -  Schaltet zwischen Still-Modus (Standard) und Verbose-Modus (Fehler via ErrBox) um.
 FilesFolderVerbose(bolOn)

✅  ErrBox  -   Zentrale Fehleranzeige, wird intern im Verbose-Modus genutzt.
 ErrBox(errNo, errDesc, [errMod], [errProc], [errInfo])


⌨️ Aufzählungen (Enums)

eSystemFolder

Bekannte Systemordner für SystemFolder(). Benutzerprofil: sfProfile, sfDesktop, sfDocuments, sfDownloads, sfPictures, sfMusic, sfVideos, sfFavorites, sfRecent, sfSendTo. Anwendungsdaten: sfAppData, sfLocalAppData, sfProgramData. Startmenü/geteilt: sfStartMenu, sfPrograms, sfStartup, sfCommonStartMenu, sfCommonDesktop, sfPublic. System: sfWindows, sfSystem, sfProgramFiles, sfProgramFilesX86, sfFonts, sfTemp, sfRecycleBin. Anwendung: sfApp (Ordner der laufenden Access-DB).

eLogLevel

Schweregrad für LogWrite(): logINFO, logWARN, logFAIL, logSUCCESS, logDONE. Textformat: "2026-07-15 14:30:00  [INFO   ]   Nachricht" (Level auf 7 Zeichen aufgefüllt). CSV: "2026-07-15 14:30:00;INFO;Nachricht".


🎁 Einsatz & Integration

Nur das Modul modHelper_FilesFolder importieren - fertig. Keine Verweise, kein Setup. An genau zwei Stellen nutzt das Modul eine Win32-API (per bedingter Kompilierung #If VBA7 32- und 64-Bit-sicher, ohne Verweis): SHFileOperation für den Papierkorb (FileTrash / FolderTrash) und GetSaveFileName für den Speichern-unter-Dialog (FileSaveDialog). Die zentrale Meldung ErrBox ist im Modul enthalten.


🔖 Schnelltest: RunTests (Direktfenster)

Das Modul modHelper_FilesFolder_TESTING ist reine Entwicklungshilfe. Die Prozedur RunTests fragt per InputBox einen Basispfad ab (Standard C:\), legt darunter eine Test-Struktur an (TEST, Unterordner, Beispieldateien) und ruft anschließend Abschnitt für Abschnitt jede Funktion des Moduls auf. Nach jedem Schritt wird das Ergebnis als "Label -> Ergebnis" in das Direktfenster (Strg+G) geschrieben; erwartete Negativergebnisse sind mit "expected:" markiert. Am Ende bietet es optionale Explorer-Demos und räumt die Test-Struktur nach Rückfrage wieder auf. Zweck: schneller Funktionstest und lebende Beispielsammlung. Wichtig: Dieses Modul wird NICHT für den operativen Einsatz benötigt und muss nicht mit ausgeliefert werden.


💻 Das Testformular frmFilesFolder_TESTING

Neben RunTests gibt es das interaktive Testformular frmFilesFolder_TESTING. Es listet alle Funktionen in einer Combobox (Werteliste, beim Laden gefüllt). Beim Öffnen legt das Formular automatisch einen Sandbox-Testordner unter %TEMP%\modHelper_FilesFolder_TEST an (mit Beispieldateien demo.txt, lines.txt und einem Unterordner SUB) und löscht ihn beim Schließen wieder; ein Button erstellt ihn bei Bedarf neu. Wählt man eine Funktion, zeigt das Formular oben deren vollständige Beschreibung (Zweck, Parameter, Rückgabe, Signatur, Hinweise) und führt darunter eine sichere Demo im Testordner aus - das Ergebnis erscheint im Ausgabefeld. Über das Feld 'Run' kann man einen eigenen Aufruf eintippen und ausführen; bei datenverändernden Funktionen (Delete, Trash, Move, Rename, Empty) erscheint vorher eine Sicherheitsabfrage. Der Button 'Show VBE' springt direkt zum Quellcode der gewählten Funktion. Wichtig: Alle Aufrufe des Formulars arbeiten ausschliesslich im Sandbox-Testordner unter %TEMP%, niemals auf echten Daten oder auf C:\.


💡 Was man in Produktion wirklich braucht

Für den produktiven Einsatz wird nur EIN einziges Modul benötigt: modHelper_FilesFolder (die Datei modHelper_FilesFolder.bas). Es enthält alle Funktionen sowie die zentrale ErrBox und arbeitet per Late-Binding - keine Verweise, kein Setup, 32- und 64-Bit-fähig. NICHT benötigt (reine Entwicklungshilfen, die nicht mit ausgeliefert werden müssen): das Modul modHelper_FilesFolder_TESTING (RunTests und die Demo-Engine), die Klasse clsFilesFolder (Ausgabe-Puffer für das Formular) und das Formular frmFilesFolder_TESTING. Diese drei dienen nur zum Ausprobieren, Testen und Dokumentieren. Kurz gesagt: In Produktion genügt modHelper_FilesFolder - fertig.


💥 Fazit

Mit diesen Funktionen wird Ihre Datei- und Ordnerverwaltung in Access schneller, einheitlicher und robuster – weniger Standardcode, weniger Fehlerquellen, bessere Lesbarkeit.


🧪 Probiere es aus

Die Beispieldatenbank enthält das Modul und das Formular, fertig zum Importieren. Probieren Sie es aus – und wenn es Ihnen Zeit spart, freue ich mich über eine kleine Spende über den PayPal-Link. Ich freue mich auf Ihr Feedback.