Autor: Christoph Spielmann, Düsseldorf
Bei der Windows-API (Application Programmers Interface) handelt es sich um eine mächtige Bibliothek von Funktionen, die Ihnen den Zugang zu Windows-internen Ressourcen ermöglichen. Unser Autor Christoph Spielmann hat für den vorliegenden Beitrag in seinen umfangreichen Erfahrungsschatz gegriffen, um Ihnen anhand einiger Beispiele die Möglichkeiten der API zu eröffnen.
Temporäre Dateien werden von Anwendungen vorübergehend angelegt, um verschiedene Daten, Zustände oder gerade in Bearbeitung befindliche Dokumente zwischenzuspeichern.
Es ist zwar kein Muss, aber als allgemeine übereinkunft gilt, einen im System als speziell für diesen Zweck deklarierten Ordner zur Ablage von temporären Dateien zu verwenden – den TEMP-Ordner.
Windows stellt dazu sogar eine eigene API-Funktion bereit, über die Sie den Pfad dieses Ordners ermitteln können (Gesucht – Systemordner). Und wie der Name es sagt: Temporäre Dateien sind ihrer Natur nach vergänglich – Ihre Anwendungen sollten daher auch dafür sorgen, dass sie von Ihnen angelegte temporäre Dateien spätestens beim Beenden wieder löschen.
Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal _ pszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long
Quellcode 1
Wenn Sie für Ihr Programm eine temporäre Datei erzeugen wollen, brauchen Sie einen eindeutigen Dateinamen. Denn schließlich legen ja auch andere Anwendungen im TEMP-Ordner ihre Dateien ab, sodass es leicht zu Namenskonflikten kommen könnte.
Sie könnten natürlich einfach einen beliebigen Dateinamen wählen und für den Fall, dass eine Datei dieses Namens bereits existieren sollte, in einer Schleife einen neuen Dateinamen kreieren, bis Sie einen freien gefunden haben.
Doch besser ist wie immer der Weg, die speziell dafür bereitgestellte API-Funktion GetTempFileName (s. Quellcode 1) zu verwenden. Der Funktion werden vier Parameter übergeben.
Im ersten Parameter, lpszPath übergeben Sie den Pfad, in dem der temporäre Dateiname angelegt werden soll, vorzugsweise den des TEMP-Ordners.
In lpPrefixString übergeben Sie einen aus bis zu drei Zeichen bestehenden Präfix, den Sie dem Dateinamen voranstellen möchten. Damit können Sie gewissermaßen eine Anwendung individuell hervorheben. Sie können natürlich auch ganz normal ein “tmp” übergeben.
Private Declare Function GetTempFileName _ Lib "kernel32" Alias "GetTempFileNameA" _ (ByVal lpszPath As String, ByVal lpPrefixString As _ String, ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long Private Declare Function GetTempPath Lib "kernel32" _ Alias "GetTempPathA" (ByVal BufferLength As Long, _ ByVal lpBuffer As String) As Long Private Const kLength = 255 Public Function CreateTempFile(Optional Prefix As _ String = "tmp", Optional TempPath As String) _ As String Dim nBuffer, nTempPath As String Dim nReturn, nPosEnd As Long If Len(TempPath) = 0 Then nBuffer = Space(kLength) nReturn = GetTempPath(kLength, nBuffer) If nReturn > 0 Then nTempPath = Left(nBuffer, nReturn) Else nTempPath = CurDir$ If Right$(nTempPath, 1) <> "\" Then nTempPath = nTempPath & "\" End If End If Else nTempPath = TempPath End If nBuffer = Space(kLength) nReturn = GetTempFileName(nTempPath, Left$(Prefix, _ 3), 0&, nBuffer) If nReturn <> 0 Then nPosEnd = InStr(nBuffer, Chr$(0)) If nPosEnd = 0 Then CreateTempFile = nBuffer Else CreateTempFile = Left(nBuffer, nPosEnd - 1) End If End If End Function
Quellcode 2
Um den Parameter wUnique brauchen Sie sich nicht unbedingt zu kümmern. Hier könnten Sie Ihrer temporären Datei eine von Ihrer Anwendung selbst generierte und verwaltete Nummer geben. übergeben Sie 0, erzeugt Windows selbst eine eindeutige Zahl anhand der Systemzeit.
Im Puffer lpTempFileName liefert Ihnen die Funktion den erzeugten Dateinamen zurück.
Die Funktion CreateTempFile (s. Quellcode 3) verpackt den Aufruf auf VBA-gerechte und einfach zu handhabende Weise.
Beide Parameter sind optional. Verzichten Sie auf den individuellen Präfix, wird “tmp” als Präfix verwendet. Lassen Sie die Pfadangabe weg, wird die Datei automatisch im TEMP-Ordner des Systems angelegt. Dazu wird hier die API-Funktion GetTempPath (s. Quellcode 2) direkt aufgerufen (Gesucht Systemordner). Konnte aus irgendeinem Grund keine temporäre Datei angelegt werden, wird ein leerer String zurückgegeben.
Beachten Sie, dass der Aufruf der API-Funktion GetTempFileName (s. Quellcode 2) auf jeden Fall eine Datei anlegt, die Sie nach Gebrauch oder Nichtgebrauch wieder ordnungsgemäß löschen sollten. Dieses Funktionalität der API-Funktion ist sinnvoll, da nach der Ermittlung eines unverwendeten Dateinamens dieser unter Umständen doch schon nicht mehr frei sein könnte, wenn Sie selbst nur Sekunden später eine Datei dieses Namens anzulegen versuchten.
Function CreatePathDeep(NewPath As String) As Boolean Dim nNewPath As String Dim nStart As Integer nNewPath = Trim$(NewPath) If Left$(nNewPath, 2) = "\\" Then If Len(nNewPath) > 6 Then nStart = 7 Else Exit Function End If ElseIf Mid$(nNewPath, 2, 2) = ":\" Then nStart = 4 Else Exit Function End If If nStart Then Do nPos = Instr(nStart, nNewPath, "\") If nPos Then On Error Resume Next MkDir Left$(nNewPath, nPos - 1) On Error GoTo 0 Else On Error Resume Next MkDir nNewPath If Err.Number = 0 Then CreatePathDeep = True '' Erfolg End If On Error GoTo 0 End If Loop While nPos End If End Function
Quellcode 3
Ein neuer Ordner in einem tief verschachtelten Pfad kann mit der VBA-Funktion MkDir nur dann angelegt werden, wenn der Pfad selbst bereits vorhanden ist. Anderenfalls ist es in VBA eine recht mühselige Angelegenheit.
Wollten Sie beispielsweise den Pfad c:\abc\def\ghi anlegen, wenn selbst c:\abc noch nicht existiert, sähe das etwa so aus:
On Error Resume Next MkDir "c:\abc" MkDir "c:\abc\def" MkDir "c:\abc\def\ghi" On Error GoTo 0
Direkt an Ort und Stelle im Code platziert ist das schon recht aufwändig. Es würde allerdings noch aufwendiger, wenn Sie diese Codezeilen als allgemein verwendbare Funktion implementieren wollten (s. Quellcode 3).
Für Windows-Versionen vor Windows 98 werden Sie nicht darum herum kommen, eine solche oder ähnliche Funktion auf diese Weise zu implementieren. Ab Windows 98 und unter Windows NT können Sie jedoch eine API-Funktion aus einer der System-DLLs (imagehlp.dll) verwenden.