Thema: Delphi Datei ändern, aber wie?

Einzelnen Beitrag anzeigen

Imagination

Registriert seit: 19. Mär 2003
14 Beiträge
 
#1

Datei ändern, aber wie?

  Alt 13. Jun 2004, 18:54
Guten Tag,

ich hänge mit diesen Funktionen Dateien an eine Andere.

Delphi-Quellcode:
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var
  aStream: TFileStream;
  iSize: Integer;
begin

   Result := False;
   if not FileExists(AFileName) then
      exit;
   try
      aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite);
      MemoryStream.Seek(0, soFromBeginning);
      aStream.Seek(0, soFromEnd);
      aStream.CopyFrom(MemoryStream, 0);
      iSize := MemoryStream.Size + SizeOf(Integer);
      aStream.Write(iSize, SizeOf(iSize));
   finally
      aStream.Free;
   end;
   Result := True;

end;
Anhängen:
Delphi-Quellcode:
zipStream := TMemoryStream.Create;
zipStream.LoadFromFile('d:\EineDatei.zip'); //immer eine Andere
AttachToFile('d:\kid.jpg', zipStream); //immer die gleiche Datei
zipStream.SaveToFile('d:\ergebnis.jpg');
zipStream.Free;
Wenn ich der Zip-File das Bild anhänge, so kann ich nach dem Doppelklick auf ergebnis.jpg das Bild kid.jpg öffnen. Wenn ich die Datei ergebnis.jpg einfach in ergebnis.zip umbenenne, dann kommt ein CRC-Fehler, was natürlich logisch ist.
Nun möchte ich aber die Bytes, die ich angehängt habe, wieder abschneiden, damit ich das Zip-File öffnen kann.

Mein Ansatz. Herausfinden wie große kid.jpg ist:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
kid : TMemoryStream;
begin
kid := TMemoryStream.Create();
kid.LoadFromFile('d:\kid.jpg');
showmessage(IntToStr(kid.Size));
schneiden := kid.Size;
kid.free;
SplitFile('d:\EineDatei.zip');

end;
Jetzt den Rest abschneiden:
Delphi-Quellcode:
function SplitFile(FileName : TFileName ) : Boolean;
var
  i : Word;
  fs, sStream: TFileStream;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  sStream := TFileStream.Create('d:\ergebnis.jpg', fmCreate or fmShareExclusive);
  try
      sStream.CopyFrom(fs, (fs.Size-schneiden)); //schneiden ist Größe von kid.jpg
    finally
        sStream.Free;
        fs.Free;
      end;
end;
Wenn ich jetzt ergebnis.jpg in ergebnis.zip umbenenne, zeigt er mir einen CRC-Fehler an. Muss ich noch einen Header verschicken?

Ich bin noch relativ großer Anfänger und bin für jede Hilfe sehr dankbar!

P.S. Hoffentlich ist es jetzt etwas verständlicher.
  Mit Zitat antworten Zitat