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