Rubrik: Dateisystem · Dateien allgemein | VB-Versionen: VB4, VB5, VB6 | 19.08.02 |
Datei kürzen Mit der SetEndOfFile-Funktion lässt sich eine beliebige Datei schnell und einfach um eine bestimmte Anzahl Bytes kürzen. | ||
Autor: LonelySuicide666 | Bewertung: | Views: 18.217 |
www.vbapihelpline.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie lässt sich eine bestimmte Anzahl Bytes an eine bestehende Datei anhängen, so dass die Datei größer wird?
Diese Frage lässt sich recht einfach mit VB-Boardmitteln beantworten:
Dim F As Integer Dim sText As String Dim sFile As String ' Besagte Datei... sFile = "c:\temp\MyFile.dat" ' Inhalt, der angehängt werden soll sText = Space$(10) ' Einfach nur 10 Bytes... F = FreeFile Open sFile For Binary As #F Seek #F, LOF(F) + 1 Put #F, , sText Close #F
Alles noch recht einfach.
Aber wie sieht es aus, wenn man eine bestimmte Anzahl Bytes "abschneiden" will?
Auf Deutsch: Eine Datei, die regulär 1 MB groß ist soll z.B. um 10 Bytes reduziert werden.
Eine Lösung wäre, den Inhalt (blockweise) auszulesen und in eine neue Datei zu schreiben. Danach löscht man die "alte" Datei und benennt die neu erstellte Datei entsprechend um.
Es geht aber auch einfacher
Aber nicht mit VB-Boardmitteln! Sondern wie so oft über den "Umweg" des Windows-API.
Option Explicit ' zunächst die benötigten API-Deklarationen Private Declare Function CreateFile Lib "kernel32.dll" _ Alias "CreateFileA" ( _ ByVal lpFileName As String, _ ByVal dwDesiredAccess As Long, _ ByVal dwShareMode As Long, _ lpSecurityAttributes As Any, _ ByVal dwCreationDisposition As Long, _ ByVal dwFlagsAndAttributes As Long, _ ByVal hTemplateFile As Long) As Long Private Declare Function SetFilePointer Lib "kernel32.dll" ( _ ByVal hFile As Long, _ ByVal lDistanceToMove As Long, _ lpDistanceToMoveHigh As Long, _ ByVal dwMoveMethod As Long) As Long Private Declare Function SetEndOfFile Lib "kernel32" ( _ ByVal hFile As Long) As Long Private Declare Function CloseHandle Lib "kernel32.dll" ( _ ByVal hObject As Long) As Long ' Konstanten Private Const GENERIC_WRITE = &H40000000 Private Const FILE_SHARE_READ = &H1 Private Const OPEN_EXISTING = 3 Private Const FILE_FLAG_SEQUENTIAL_SCAN = &H8000000 Private Const FILE_END = 2
Und hier der Code zum "Kürzen" einer Datei...
Dim fHandle As Long Dim sFile As String Dim nBytes As Long ' Datei, die "gekürzt" werden soll sFile = "c:\temp\MyFile.dat" ' Anzahl Bytes die am Ende entfernt werden sollen nBytes = 10 ' Datei öffnen und Handle erstellen fHandle = CreateFile(sFile, GENERIC_WRITE, _ FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, _ FILE_FLAG_SEQUENTIAL_SCAN, 0&) If fHandle <> -1 Then ' Dateizeiger an die gewünschte Position setzen Call SetFilePointer(fHandle, -nBytes, ByVal 0&, FILE_END) ' Aktuelle Position als "END-Position" setzen Call SetEndOfFile(fHandle) ' Datei schließen Call CloseHandle(fHandle) Else ' Fehler: Evtl. existiert die Datei nicht... End If
Auf diese Weise lässt sich z.B. der ID3-Tag einer MP3-Datei eben schnell mal entfernen