![]() |
teil einer datei entfernen
ich will einen teil einer datei entfernen
adtei wird geladen und durch
Delphi-Quellcode:
geprüft
if (Dword((@buf[$000000])^) <> $014b4246)
then begin StatusBar.Panels[0].Text:='Falsche Datei!'; exit; end else StatusBar.Panels[0].Text:='Datei Ok!'; aber wie kann ich jetzt z.B. den bereich 000000 bis 00000F entfernen |
Re: teil einer datei entfernen
Zitat:
wo steckt denn da bitte das Laden drin? Wäre also nett, wenn Du ein wenig mehr schreiben könntest als Du es in diesem Beitrag tust. Was in deinem Puffer Buf steht, warum Du hier einen zeiger auf das Array verwendest (und gleich wieder dereferenzierst) usw. geht leider gar nicht aus deinem Beitrag hervor. Vorallem aber fehlt natürlich wie Du die Datei überhaupt lädst/speicherst. Ohne kann man Dir zwar zig Möglichkeiten nennen, weiß aber natürlich nicht wie weit sie zu dem passen was Du machst. Gruß Der Unwissende |
Re: teil einer datei entfernen
das laden und speichern
Delphi-Quellcode:
die Funktion
procedure TConvertData.FBK2BINClick(Sender: TObject);
var iFHandle : THandle; iFileSize : Integer; iBytesRead: Integer; chBuffer: array[0..$3FFFF] of Byte; begin iFHandle:=INVALID_HANDLE_VALUE; ProgressBar.Position:=10; with OpenDialog do begin FilterIndex:=1; InitialDir := '.'; DefaultExt := 'fbk'; Filter := 'Fbk files (*.fbk)|*.fbk|All files (*.*)|*.*'; Options:=Options+[ofFileMustExist]-[ofHideReadOnly] +[ofNoChangeDir]-[ofNoLongNames]-[ofNoNetworkButton]-[ofHideReadOnly] -[ofOldStyleDialog]-[ofOverwritePrompt]+[ofPathMustExist] -[ofReadOnly]-[ofShareAware]-[ofShowHelp]; Title:='Dateiauswahl FBK'; end;//with OpenDialog if OpenDialog.execute then begin iFHandle:=FileOpen(OpenDialog.FileName,fmOpenRead or fmShareCompat); if iFHandle<>INVALID_HANDLE_VALUE then begin iFileSize:=$40000; iBytesRead := FileRead(iFHandle, chBuffer, iFileSize); FileClose(iFHandle); iFHandle:=INVALID_HANDLE_VALUE; if iBytesRead=iFileSize then begin ProgressBar.Position:=30; if ClearFBK(chBuffer[0]) then begin // aufruf Funktion exit; with SaveDialog do begin FilterIndex:=0; FileName := ExtractFileName(OpenDialog.FileName); InitialDir := ExtractFilePath(OpenDialog.FileName); DefaultExt := 'bin'; Filter := 'bin files (*.bin)|*.bin'; Options:=Options+[ofFileMustExist]-[ofHideReadOnly] +[ofNoChangeDir]-[ofNoLongNames]-[ofNoNetworkButton]-[ofHideReadOnly] -[ofOldStyleDialog]-[ofOverwritePrompt]+[ofPathMustExist] -[ofReadOnly]-[ofShareAware]-[ofShowHelp]; Title:='Name der Bin Datei'; end;//with ProgressBar.Position:=40; if SaveDialog.Execute then begin ProgressBar.Position:=60; iFHandle:=FileCreate(SaveDialog.FileName); if iFHandle<>INVALID_HANDLE_VALUE then begin ProgressBar.Position:=80; if FileWrite(iFHandle,chBuffer,$40000)=$40000 then begin FileClose(iFHandle); StatusBar.Panels[0].Text:='Datei gespeichert '+SaveDialog.FileName; ProgressBar.Position:=100; exit; end; end; StatusBar.Panels[0].Text:='Datei nicht gespeichert '+ SaveDialog.FileName+'!'; end else begin StatusBar.Panels[0].Text:='?'; if iFHandle<>INVALID_HANDLE_VALUE then FileClose(iFHandle); exit; end; end; end // if iBytesRead=iFileSize else begin StatusBar.Panels[0].Text:='Fehler beim lesen der Datei: '+OpenDialog.FileName+'!'; end; end // if iFHandle>0 else begin StatusBar.Panels[0].Text:='Kann Datei nicht öffnen '+OpenDialog.FileName+'!'; end; end; if iFHandle<>INVALID_HANDLE_VALUE then FileClose(iFHandle); end;
Delphi-Quellcode:
hoffe das reicht
function TConvertData.ClearFBK(var buf : array of byte) : boolean;
begin result:=False; if (Dword((@buf[$000000])^) <> $014b4246) then begin StatusBar.Panels[0].Text:='Falsche Datei!'; exit; end else StatusBar.Panels[0].Text:='Datei Ok!'; end; |
Re: teil einer datei entfernen
Ich habe einmal eine funktion für mich zusammengeschrieben die einen Teil einer Datei einfach rauslöscht und den rest anhängt.
Delphi-Quellcode:
function CutFile(Filename: string; FromOffset, Count: Cardinal): Cardinal;
var hFile: THandle; dwSize, dwCopyFrom, dwCopyLength, lpNumberOfBytesRead: Cardinal; lpBuffer: Pointer; begin Result := Cardinal(-1); hFile := CreateFile(PChar(Filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if (hFile <> INVALID_HANDLE_VALUE) then begin dwSize := GetFileSize(hFile, nil); if (dwSize >= (FromOffset + Count)) then begin dwCopyFrom := FromOffset + Count; dwCopyLength := dwSize - (FromOffset + Count); if dwCopyLength = 0 then begin SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN); SetEndOfFile(hFile); Result := dwSize - Count; end else begin lpBuffer := VirtualAlloc(nil, dwCopyLength, MEM_COMMIT, PAGE_READWRITE); if (lpBuffer <> nil) then begin SetFilePointer(hFile, dwCopyFrom, nil, FILE_BEGIN); ReadFile(hFile, lpBuffer^, dwCopyLength, lpNumberOfBytesRead, nil); if (lpNumberOfBytesRead = dwCopyLength) then begin SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN); SetEndOfFile(hFile); WriteFile(hFile, lpBuffer^, dwCopyLength, lpNumberOfBytesRead, nil); if (lpNumberOfBytesRead = dwCopyLength) then begin VirtualFree(lpBuffer, 0, MEM_RELEASE); Result := dwSize - Count; end; end; end; end; end else begin if (FromOffset < dwSize) then begin SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN); SetEndOfFile(hFile); Result := FromOffset; end; end; end; CloseHandle(hFile); end; |
Re: teil einer datei entfernen
Hallo,
das eigentliche Kopieren der Datei lässt sich doch deutlich vereinfachen, wenn man auf Streams zurückgreift:
Delphi-Quellcode:
Das gilt auch dann noch, wenn man eine CallBack-Prozedur einführt um einen ProgressBar zu treiben.
procedure CopyBytes(const fnIn, fnOut: TFileName; start: Int64);
var sIn, sOut: TStream; begin sIn := TFileSTream.Create(fnIn, fmOpenRead or fmShareDenyWrite); sOut := tFileStream.Create(fnOut, fmCreate); sIn.Position := start; sOut.CopyFrom(sIn, sIn.Size - sIn.Position); sOut.Free; sIn.Free; end; Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz