Temporären Dateinamen ermitteln
Veröffentlicht am 28.07.2008 von Sebastian Krogolewski
Wer mit Dateien arbeitet der braucht gelegentlich eine temporäre Datei in der er etwas zwischenspeichern muss. Dabei steht man vor dem Problem wie diese temporäre Datei benannt werden soll da es ja theoretisch passieren kann das der gewählte Dateiname bereits durch eine andere Anwendung oder einen anderen Thread aus der eigenen Anwendung bereits verwendet wird. Die Win API bietet dafür die Funktion GetTempFileNameA aus der Kernel32.Dll an.
Einbinden der API Funktion GetTempFileNameA als GetTempFileNameAPI aus der Kernel32.Dll.
1 2 3 | Private Declare Function GetTempFileNameAPI Lib "kernel32" Alias "GetTempFileNameA" ( _ ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long |
GetTempFileNameA erwartet 4 Parameter:
lpszPath: Pfadangabe wo der Dateiname ermittelt werden soll.
lpPrefixString: Prefix für den Dateinamen. Es werden max. die ersten 3 Zeichen verwendet.
wUnique: Wenn wUnique = 0, dann ermittelt die Funktion einen eindeutigen Namen. Wenn der Wert <> 0 dann wird ein Dateiname ermittelt aber nicht auf eindeutigkeit geprüft.
lpTempFileName: Speicherbereich in dem der erzeugte Dateiname geschrieben wurde.
Rückgabewert:
Bei Erfolg: der numerische Wert der Zahl welche in dem Dateinamen verwendet wird.
Bei Fehlschlag: 0
1 2 3 4 56 7 8 9 1011 12 13 14 15 | Public Function getTempFileName(Optional ByVal Prefix As String = "TMP") As String Dim strTmp As String Dim RetVal As Long 'Speicher reservierenstrTmp = String$(256, 0) 'Den Dateinamen im Zielordner ermitteln RetVal = GetTempFileNameAPI(FullPath, Prefix, 0&, strTmp) If (RetVal <> 0) Then getTempFileName = Left$(strTmp, InStr(strTmp, vbNullChar) - 1) Else getTempFileName = "" End If End Function |
Dadurch das der Zielpfad mit übergeben wird, kann man sich diese temporären Dateien in belibigen Ordnern erstellen lassen. In der XP und Vista Welt ist heutzutage nicht mehr ratsam solche temporären Dateien außerhalb des Temp Ordners zu verwenden, da die Berechtigungen oder UAC Probleme (sogar Abstürze) verursachen kann. Hier eine etwas erweiterte Variante der obigen Funktion in welcher der aktuelle Pfad des Temp Ordners automatisch ermittelt wird.
zusätzliche Win API Funktion GetTempPathA aus der kernel32.dll einbinden.
1 2 | Private Declare Function GetTempPathAPI Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long |
GetTempPath erwartet 2 Parameter:
nBufferLength: größe des reservierten Puffers.
lpBuffer: Reservierter Speicher in dem das Ergebnis geschrieben wird.
Rückgabewert:
Tatsächliche länge der Zeichenkette.
Hinweis:
Die API Funktion ermittelt nicht nur den Dateinamen sondern erzeugt auch gleichzeitig eine Datei der länge 0 unter diesem Namen.
Zusätzliche Funktion welche den Pfad des Temp Ordners ermittelt.
1 2 3 4 56 7 8 9 1011 12 13 14 | Public Function GetTempPath(Optional ByVal AddBackslash As Boolean) As String Dim strPath As String Dim strLen As Long strPath = String$(256, 0)strLen = GetTempPathAPI(len(strPath), strPath) If (strLen > 0) Then If (AddBackslash) Then GetTempPath = Left$(strPath, strLen) Else GetTempPath = Left$(strPath, strLen - 1) End If End If End Function |
und zu guter letzt die erweiterte getTempFileName Funktion
1 2 3 4 56 7 8 9 1011 12 13 14 15 | Public Function getTempFileName(Optional ByVal Prefix As String = "TMP") As String Dim strTmp As String Dim RetVal As Long 'Speicher reservierenstrTmp = String$(256, 0) 'gleichzeitig den Temp Ordner ermitteln und dann dort den temporären Dateinamen RetVal = GetTempFileNameAPI(GetTempPath, Prefix, 0&, strTmp) If (RetVal <> 0) Then getTempFileName = Left$(strTmp, InStr(strTmp, vbNullChar) - 1) Else getTempFileName = "" End If End Function |
Mit diesen Funktion sollten jegliche Probleme mit eindeutigen Dateinamen, Berechtigungen oder UAC unter Vista keine Schwierigkeiten mehr machen.






