Dateilänge kürzen ohne Umkopieren
Veröffentlicht: 23. Aug 2001 | Aktualisiert: 13. Jun 2004
Von Hening Schünke und Michael Clemens
Die Länge einer Datei können Sie mit dem hier vorgestellten Beispiel verringern, ohne die Datei umzukopieren.
Mittels API-Funktionen wird die Position des Dateizeigers auf die gewünschte Dateilaenge gesetzt. An diese Stelle wird ein End Of File (EOF) geschrieben und die Datei wird geschlossen.
Für das Beispiel brauchen Sie eine Form und ein Modul in Visual Basic.
Kopieren Sie die folgenden Deklarationen in das Modul:
Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const OPEN_ALWAYS = 4 Public Const FILE_ATTRIBUTE_NORMAL = &H80 Public Const INVALID_HANDLE_VALUE = -1 Private Declare Function CloseHandle Lib "kernel32" ( _ ByVal hObject As Long) As Long Private Declare Function CreateFile Lib "kernel32" _ Alias "CreateFileA" (ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _ ByVal lpSecurityAttributes As Long, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) _ As Long Public Declare Function SetFilePointer Lib "kernel32" ( _ ByVal hFile As Long, ByVal lDistanceToMove As Long, _ lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long Public Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long
Die folgende Subroutine wird mit dem kompletten Dateinamen, inklusive vollständiger Pfad, als Parameter aufgerufen.
Sollte die Datei größer sein als 2 GB, so sollten Sie bei der Funktion SetFilePointer beim Parameter (lpDistanceToMoveHigh) das HighWord (die vorderen 32 Bit) der Positionsangabe eintragen.
Sub truncateFile(Fname As String) Dim fHandle As Long Dim fSuccess As Long ' Die Datei oeffnen, um ein Handle darauf zu bekommen fHandle = CreateFile(Fname, GENERIC_WRITE Or GENERIC_READ, _ 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) ' Ueberpruefen, ob das Handle gueltig ist If fHandle <> INVALID_HANDLE_VALUE Then ' Den Dateizeiger auf das fuenfte Zeichen setzen fSuccess = SetFilePointer(fHandle, 5, 0, 0) ' EOF an der aktuellen Position des Dateizeigers eintragen fSuccess = SetEndOfFile(fHandle) ' Die Datei schliessen fSuccess = CloseHandle(fHandle) End If End Sub
Mittels einer Form und des darauf befindlichen Buttons wird der Code wie folgt aufgerufen:
Private Sub Command1_Click() Dim strFilename As String ' Hier die Datei mit vollstaendigem Pfad angeben strFilename = "G:"uickies\TruncateFile\file.bin" Call truncateFile(strFilename) End Sub